Laravel覆盖hasMany关系的删除方法

时间:2015-07-18 18:14:29

标签: php laravel laravel-5 eloquent

我正在尝试覆盖模型上的删除方法。

在我的用户模型中,我有这段代码:

public function delete()
{
    if ( ! is_null($this->remote_id)) {
        $this->location_id = null;
        $this->save();
    } else {
        parent::delete();
    }
}

如果remote_id为null,则此方法基本上会删除记录。如果它不为null,则通过将location_id设置为null来断开用户与该位置的连接。

当我执行$ user-> delete()时,会调用此方法并且它可以正常工作。

但是,当我删除像这样的位置的所有用户时,$ location-> users() - > delete()此方法不会被调用。我做错了吗?

2 个答案:

答案 0 :(得分:0)

如果您想要使用模型方法(或模型事件被触发),您需要遍历所有用户并单独删除它们,例如:

$location->users->map(function($user) {
  $user->delete();
});

如果你有很多用户,这样的操作可能非常耗时,所以我宁愿只更新所有相关模型,而不是全部取出并在每个模型上调用 delete():< / p>

$location->users()->update(['location_id' => null]);

答案 1 :(得分:0)

你可以试试这个:

// In App/Location.php
public static function boot()
{
    parent::boot();
    static::deleting(function($location) {
        foreach($location->users as $user) {
            if( ! is_null($user->remote_id) ) {
                $user->location_id = null;
                $user->save();
            }
            else {
                $user->delete();
            }
        }
    });
}

当您删除任何User模型时,这将删除所有location_id模型,具体取决于location_id状态(如果nullLocation),但是location_id不是nulluser->location_id的值将更新为null