覆盖的创建方法不会触发关系()->create()

问题描述 投票:0回答:1

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

Modul::find($id)->tags()->create($request->all());

标签Modul中的创建方法为:

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 调用,但它从未被调用。那么我是否必须覆盖第二个创建函数?

php laravel laravel-5 relationship
1个回答
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 内部使用。

© www.soinside.com 2019 - 2024. All rights reserved.