【问题标题】:Overwritten create method doesn't fire for relationship()->create()覆盖的 create 方法不会为 relationship()->create() 触发
【发布时间】:2016-03-11 06:46:40
【问题描述】:

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

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

【问题讨论】:

  • 你会在创建函数中检查dd(Auth::user()->id);吗?
  • 我做到了,但我只是收到未设置 user_id 的错误。当我写 $attributes['user_id'] = 1 时,它说 user_id 没有设置。
  • user_id 是否添加到 $fillable 数组中?
  • 是的。正如我所说:当我将 user_id 与请求数组合并时,一切正常。但我想将它添加到 create 函数中,这样我就不必在每次创建调用时合并。

标签: laravel relationship laravel-5.1


【解决方案1】:

您调用的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 内部使用。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多