Laravel在Model中的默认user_id属性

时间:2016-07-10 07:10:31

标签: laravel-5

我有一个模特

class Foo extends Model
{
    protected $fillable = [
        'name',
        'user_id'
    ];

}

我想将Auth::user()->id默认设置为user_id列。所以我补充道:

class Foo extends Model
{
    protected $fillable = [
        'name',
        'user_id'
    ];

    public function setUserIdAttribute()
    {
        $this->attributes['user_id'] = Auth::user()->id;

    }
}

从我的控制器我要求Foo::create($data)没有user_id键。 但它没有按预期工作。由于store()缺失,Integrity constraint violationuser_id。 (用户已登录以实现创建页面)

2 个答案:

答案 0 :(得分:3)

您提供了一个使用访问器的示例。

https://laravel.com/docs/5.1/eloquent-mutators#accessors-and-mutators

来自官方文件:

  

当尝试检索first_name:

的值时,Eloquent会自动调用访问者

如果要为某些属性设置默认值,则需要使用Observers。

<?php
// file app/models/Foo.php
namespace App\Models;

use App\Observers\FooObserver;

class Foo extends Model
{
    protected $fillable = [
        'name',
        'user_id'
    ];

    public static function boot() {
        parent::boot();
        parent::observe(new FooObserver);
    }
}

<?php
// file app/observers/FooObserver.php
namespace App\Observers;

use App\Models\Foo;

class FooObserver {

    public function creating(Foo $model) {
        $this->user_id = Auth::user()->id;
    }
}

关于官方文档中的模型观察者: https://laravel.com/docs/5.0/eloquent#model-observers

答案 1 :(得分:3)

我找不到有关Laravel 5.6的model-observers的官方文档。但您仍然可以通过此代码来实现

public static  function boot()
{
    parent::boot(); // TODO: Change the autogenerated stub
    // it will automatically add authenticate user to created_by column of selected model 
    static::creating(function ($model){
        $model->created_by = auth()->user()->id;
    });
}