从belongsToMany关系覆盖attach方法

时间:2016-06-01 12:48:53

标签: php laravel laravel-5 eloquent

我想在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()

我想在模型中重载belongsToMany函数,但它看起来不是一个好的解决方案,它看起来像一个黑客。因为这样做,我必须创建一个扩展原始版本的新BelongsToMany类,在attach中调用原始Model方法,然后覆盖返回的对象,然后我的代码变成意大利面,所以我扔了一切。

有没有优雅的方法来做到这一点?

旁注:rand属性是一个愚蠢的例子,它只是一个例子,不关心它。

1 个答案:

答案 0 :(得分:2)

saveRole模型中创建User方法

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

然后打电话

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

我认为它比重载BelongsToMany

更容易和干净