【问题标题】:Overriding attach method from belongsToMany relationship从 belongsToMany 关系覆盖附加方法
【发布时间】:2016-06-01 21:02:40
【问题描述】:

我想在 belongsToMany 关系中的每个附加/保存的数据透视表上添加一个属性。

例子:

// I don't want to do add the `rand` attribute everytime...
User::find(1)->roles()->save($role, ['rand' => rand()]);
User::find(7)->roles()->save($role, ['rand' => rand()]);
User::find(42)->roles()->save($role, ['rand' => rand()]);

// ... I just want to call save...
User::find(1)->roles()->save($role);
// ... and magically, `rand` attribute is set to rand()

我想在 Model 中重载 belongsToMany 函数,但它看起来不是一个好的解决方案,它看起来像一个 hack。因为这样做,我必须创建一个新的BelongsToMany类扩展原来的类,在Model中调用原来的attach方法,然后重写返回的对象,然后我的代码就变成了意大利面条,所以我把所有的东西都扔了。

有什么优雅的方法可以做到这一点吗?

旁注:rand 属性是一个愚蠢的例子,它只是一个插图,不要在意。

【问题讨论】:

  • 您是否为这种关系使用了数据透视表?我们可以在您的模型中看到它吗?
  • 是的,我正在使用数据透视表。我已经编辑了我的问题,谢谢:)
  • 您是否尝试过在模型上监听 Eloqeunt 事件 creating 并在其中添加属性 laravel.com/docs/5.2/eloquent#events
  • 我要更新枢轴,而不是模型(除非我弄错了,枢轴没有模型)。
  • 这个包可以帮助你github.com/fico7489/laravel-pivot(或者你可以从中得到想法)

标签: php laravel laravel-5 eloquent


【解决方案1】:

在您的 User 模型中创建 saveRole 方法

public function saveRole($role)
{
    $this->roles()->save($role, ['rand' => rand()]);
    return $this;
}

然后打电话

User::find(1)->saveRole($role);

我认为它比重载BelongsToMany 类更容易和干净

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2013-03-16
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多