对于relationship() - > create(),不会触发覆盖的create方法

时间:2015-12-06 17:34:31

标签: laravel relationship laravel-5.1

我想通过以下调用向模型添加新标记:

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调用,但它从未调用过。那么我是否需要覆盖一个创建函数?

1 个答案:

答案 0 :(得分:3)

您调用的create方法未在Tag模型上定义,它是在关系类上定义的。因此,如果您的关系是多对多关系,那么create方法就是在Illuminate\Database\Eloquent\Relations\BelongsToMany类中定义的方法。

该方法在内部调用newInstance模型方法。因此,如果要将user_id添加到属性,则可以覆盖该方法,甚至可以覆盖__constructor,因为这些方法会创建模型的新实例。所以这应该适合你的情况:

public function newInstance($attributes = [], $exists = false)
{
    $attributes['user_id'] = Auth::id();

    return parent::newInstance($attributes, $exists);
}

话虽如此,最好将user_id作为参数传递,因为否则您将模型与身份验证系统紧密耦合,并且可能具有无法预料的结果该方法也由Eloquent在内部使用。