Laravel Eloquent один -> многие отношения с родителями - PullRequest
0 голосов
/ 28 сентября 2018

У модели пользователя много друзей. Идентификатор первичного ключа

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
        public function friends()
        {
            return $this->hasMany(Friend::class);
        }
}

Модель друга;принадлежит пользователю.Внешний ключ user_id.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Friend extends Model
{
    protected $guarded = ['id'];

    //Make sure birthday is always in right format  
    public function setBirthdayAttribute($value)
    {
        //Put in mysql format
    $this->attributes['birthday'] = date("Y-m-d",strtotime($value));
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Ошибка при обновлении пользователя со следующим кодом контроллера:

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \App\Friend  $friend
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, Friend $friend)
{
        $friend->fill($request->all());
        //Assign user to logged in user...does NOT work; things it is a column
        $friend->user = \Auth::user();
        $friend->save();
        return redirect(action('FriendsController@index'));
}

Сообщение об ошибке при сохранении:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user' in 'field list' (SQL: update `friends` set `last_name` = Muench!!, `updated_at` = 2018-09-28 13:26:01, `user` = {"id":1,"name":"Chris","email":"me@chrismuench.com","email_verified_at":null,"created_at":"2018-09-27 19:52:03","updated_at":"2018-09-27 19:52:03","braintree_id":null,"paypal_email":null,"card_brand":null,"card_last_four":null,"trial_ends_at":null} where `id` = 8)

Есть ли причина, по которой яне может назначить пользователя с объектом пользователя?Я знаю, что мог бы установить столбец user_id, но было бы неплохо, если бы я мог обойти объекты.

1 Ответ

0 голосов
/ 28 сентября 2018

Если вы хотите назначить объект, а не свойство в вашем контроллере, вам нужно добавить следующий мутатор

public function setUserAttribute($user)
{
   $this->attributes['user_id'] = $user->id;
}

к вашему Friend объекту.

Однако это может быть довольно рискованно, потому что имя отношения также user, поэтому лучше использовать другое имя (например, friend_user, а затем имя метода setFriendUserAttribute) или использовать вместо него метод Eloquent associate:

$friend->user()->associate(\Auth::user()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...