В моем приложении есть несколько моделей: Пользователь и Профиль. Модель User предназначена только для компаний, мое приложение - только для компаний. Когда пользователь регистрируется, он вводит только свое имя, адрес электронной почты и пароль. В модели "Мой профиль" есть столбцы для названия компании, адреса и т. Д. Форма моего профиля не работает; не сохраняется в базе. Вот установка:
Контроллер формы:
public function update($company_name)
{
$user = User::whereCompanyName($company_name)->firstOrFail();
$user->fill(Input::all());
$user->save();
flash('You have successfully edited your profile');
return redirect('/');
}
User.php:
public function profile()
{
return $this->hasOne('Profile');
}
Profile.php:
protected $fillable = ['company_name', 'company_logo', 'company_founded'];
public function user()
{
return $this->belongsTo('App\User', 'user_id','ID');
}
Форма:
{!! Form::model($user, array('method' => 'PATCH', 'route' => array('profile.update', $user->company_name), 'files' => true)) !!}
{!! Form::hidden('user_id', Auth::user()->id) !!}
// more fields
<div class="form-group">
{!! Form::label('company_name', 'Company Name') !!}
{!! Form::text('company_name', null, ['class' => 'form-control']) !!}
</div>
{!! Form::submit('Update Profile', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
Правильно ли я установил отношения? В базу данных ничего не сохраняется.
Ответ 1 · рейтинг 1 · Martin Bean
Вы обновляете только модель пользователя и модель пользователя. Вам также необходимо установить атрибуты в отношении profile:
$user->update(Input::all());
$user->profile->update(Input::all());
Действие вашего контроллера также можно немного упорядочить, используя привязку маршрута к модели, чтобы внедрить ваш User экземпляр модели, а также использовать сервисный контейнер для предоставления Request экземпляра, чтобы вы не использовали Input фасад:
public function update(User $user, Request $request)
{
$user->update($request->all());
$user->profile->update($request->all());
flash('You have successfully updated your profile.');
return redirect('/');
}
Ответ 2 · Gustavo Gama
Я хочу прокомментировать, но у меня недостаточно репутации :( Несколько дней назад я обнаружил небольшую проблему с этим подходом:
$user->update(Input::all());
$user->profile->update(Input::all());
В этом случае мутаторы в связанной модели (профиль в примере), подобные этой, не вызываются (это может быть ошибкой):
public function setLoremIpsumAttribute($attr)
{
# code
}
В контроллере я попробовал другой подход, и он сработал:
$user->update($request->all());
$user->profile->fill($request->all()['profile'])->push();
Ответ 3 · Gabriel Sigouin
В Laravel 5, когда вы хотите связать с отношением, вам нужно, например, (сообщение с комментариями) использовать метод из вашего комментария.
Post::find(id)->comment()->where(your where statement)
Документы из Laravel:
Если вам нужно добавить дополнительные ограничения для получения комментариев, вы можете вызвать метод комментариев и продолжить связывание условий:
$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();