Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Отношения Laravel 5 не работают?

Автор вопроса: SylarОтветов: 3

В моем приложении есть несколько моделей: Пользователь и Профиль. Модель 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() !!}

Правильно ли я установил отношения? В базу данных ничего не сохраняется.

  • Предоставьте нам код вашего контроллера. mininoz 09.04.2015
  • @mininoz только что понял. Это обновлено Sylar 09.04.2015
  • Также не забудьте изменить profile() в User.php: return $this->hasOne('App\Profile'); JasonK 09.04.2015

laravellaravel-5relationship

Ответы

Ответ 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();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы