我有一个模特
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 violation
会user_id
。 (用户已登录以实现创建页面)
答案 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;
});
}