如何在Laravel 5.2中自动填充外键列值?

时间:2016-02-18 11:24:45

标签: php laravel laravel-5.2

我正在开发laravel 5.2,也是laravel的初学者。我在数据库中有usersclients表。客户端表的user字段存储id column(primary key) of users table的值。即,一个用户拥有许多客户端,一个客户端属于一个用户。现在来问题了。当我要插入登录用户的新客户端时,我收到错误。没有任何错误消息。我搜索并了解可能是因为外键列名是user,而不是user_id。因此,我将客户端模型从return $this->belongsTo('App\User');更新为return $this->belongsTo('App\User', 'user');。但仍然失败了。如果有人知道答案,那么答案将不胜感激。这是我的代码。

ClientController(尝试1)

$request->user()->clients()->create([
    'user' => $request->user()->id,
    'email' => $request->email,
    'age' => $request->age
]);

ClientController(尝试2)

$request->user()->clients()->create([
    'email' => $request->email,
    'age' => $request->age
]);

客户端模型

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Ak\Scopes\AgeScope;

class Client extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new AgeScope);
    }

    public function user()
    {
        return $this->belongsTo('App\User', 'user');
    }

}

用户模型

namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password', 'country'
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected  $date = ['deleted_at'];

    public function client()
    {
        return $this->hasMany('App\Client', 'user');
    }
}

3 个答案:

答案 0 :(得分:3)

抱歉,你的关系错了。而且你正在使用

 $request->user()->clients()

而不是

  $request->user()->client() 

你们关系中的客户是单一的。客户端函数体应该是

  return $this->hasMany('App\Client', 'user');

并在您的客户端模型中添加

 $fillable = ['email', 'age', 'user'];

并将客户端模型中的用户功能更改为

public function user()
{
    return $this->belongsTo('App\User', 'user');
}

orm应该是这样的

$request->user()->client()->create([
   'user' => $request->user()->id,
   'email' => $request->email,
   'age' => $request->age
]);

答案 1 :(得分:0)

尝试将protected $fillable = ['email', 'age'];添加到您的客户端模型。

More on mass assignement

编辑: 试试这个

路线:

Route::post('user/{user}/client', 'YourController@store');

控制器:

public function store(Request $request, User, $user){
    $user->client()->create([
       'user' => $request->user()->id,
       'email' => $request->email,
       'age' => $request->age
    ]);
}

答案 2 :(得分:0)

问题已解决

问题解决了,因为我必须在客户端模式下编写public $timestamps = false;。之后,我不需要手动插入user值。因为laravel正在执行该任务,因为我在User和Client Models关系中编写了外键。即手动return $this->hasMany('App\Client', 'user')return $this->belongsTo('App\User', 'user')

我无法理解我应该为这个laravel功能做些什么。我应该哭还是笑?