覆盖的创建方法不会为 relationship()->create() 触发
Overwritten create method doesn't fire for relationship()->create()
我想通过以下调用向模型添加新标签:
Modul::find($id)->tags()->create($request->all());
标签Modul中的create方法是:
public static function create(array $attributes = [])
{
$attributes['user_id'] = Auth::user()->id;
return parent::create($attributes);
}
但是它说 user_id 没有设置。
当我打电话时
Modul::find($id)->tags()->create(array_merge($request->all(), ['user_id' => Auth::user()->id]));
一切正常。
我在 create 函数中进行了 echo 调用,但从未调用过。那么有没有我必须覆盖的第二个创建函数?
您正在调用的 create
方法未在 Tag
模型上定义,它是在关系 class 上定义的。因此,如果您的关系是多对多关系,那么 create
方法就是在 Illuminate\Database\Eloquent\Relations\BelongsToMany
class.
上定义的方法
该方法在内部调用 newInstance
模型方法。因此,如果您想将 user_id
添加到属性中,您可以覆盖该方法甚至 __constructor
,因为这些方法会创建模型的新实例。所以这应该适用于你的情况:
public function newInstance($attributes = [], $exists = false)
{
$attributes['user_id'] = Auth::id();
return parent::newInstance($attributes, $exists);
}
也就是说,最好将 user_id
作为参数传递,否则您会将模型与身份验证系统紧密耦合,并且可能会产生 无法预料的结果 因为该方法也被 Eloquent.
在内部使用
我想通过以下调用向模型添加新标签:
Modul::find($id)->tags()->create($request->all());
标签Modul中的create方法是:
public static function create(array $attributes = [])
{
$attributes['user_id'] = Auth::user()->id;
return parent::create($attributes);
}
但是它说 user_id 没有设置。
当我打电话时
Modul::find($id)->tags()->create(array_merge($request->all(), ['user_id' => Auth::user()->id]));
一切正常。
我在 create 函数中进行了 echo 调用,但从未调用过。那么有没有我必须覆盖的第二个创建函数?
您正在调用的 create
方法未在 Tag
模型上定义,它是在关系 class 上定义的。因此,如果您的关系是多对多关系,那么 create
方法就是在 Illuminate\Database\Eloquent\Relations\BelongsToMany
class.
该方法在内部调用 newInstance
模型方法。因此,如果您想将 user_id
添加到属性中,您可以覆盖该方法甚至 __constructor
,因为这些方法会创建模型的新实例。所以这应该适用于你的情况:
public function newInstance($attributes = [], $exists = false)
{
$attributes['user_id'] = Auth::id();
return parent::newInstance($attributes, $exists);
}
也就是说,最好将 user_id
作为参数传递,否则您会将模型与身份验证系统紧密耦合,并且可能会产生 无法预料的结果 因为该方法也被 Eloquent.