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

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

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


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


Ответы (3)


Вы обновляете только модель пользователя и модель пользователя. Вам также необходимо установить атрибуты в отношении 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('/');
}
person Martin Bean    schedule 09.04.2015
comment
Мне нравится твой путь. Я попробую это со своим следующим контроллером. - person mininoz; 09.04.2015
comment
Я получаю 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 no such column: _method' - person Sylar; 09.04.2015
comment
@Sylar Я предполагаю - поскольку вы делаете Input::all(), Laravel пытается обновить столбец, соответствующий скрытому полю в форме с именем _method. Вместо этого используйте Input::except() и передайте массив всех имен входных данных формы, которые не обновлять. Или вы также можете использовать Input::only() и указать имена входов, которые должны использоваться при обновлении. - person kalatabe; 09.04.2015
comment
@Sylar Этого не должно происходить, если вы используете модель. Laravel будет пытаться заполнить атрибуты, объявленные в свойстве $fillable, только при передаче массива в update(). - person Martin Bean; 09.04.2015
comment
Но куда девать: $user->update(Input::all()); $user->profile->update(Input::all()); - person Sylar; 09.04.2015
comment
@Sylar Действие вашего контроллера. - person Martin Bean; 09.04.2015
comment
Я пришел к этому. Вы должны быть правы, поскольку у вас большой опыт, и я должен поблагодарить вас, но, возможно, в моем коде есть проблема, поскольку у меня все еще возникает проблема _method. Я могу просто добавить сведения о компании в таблицу пользователя и прекратить работу. - person Sylar; 09.04.2015
comment
@Sylar Можете ли вы опубликовать код в действии вашего контроллера в точности так, как он есть? - person Martin Bean; 09.04.2015
comment
@MartinBean Я добавил эти столбцы в таблицу пользователей. Я устал, лол - person Sylar; 09.04.2015

Я хочу прокомментировать, но у меня недостаточно репутации :( Несколько дней назад я обнаружил небольшую проблему с этим подходом:

$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();
person Gustavo Gama    schedule 09.04.2015

В Laravel 5, когда вы хотите связать с отношением, вам нужно, например, (сообщение с комментариями) использовать метод из вашего комментария.

Post::find(id)->comment()->where(your where statement)

Документы из Laravel:

Если вам нужно добавить дополнительные ограничения для получения комментариев, вы можете вызвать метод комментариев и продолжить связывание условий:

$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();
person Gabriel Sigouin    schedule 11.04.2015