对hasMany关系的重写删除方法


Laravel overwrite delete method on hasMany relationship

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

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

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

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

当我做$user->delete()这个方法被调用,它工作得很好。

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

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

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

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

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

你可以试试:

// 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_idnull),当你删除任何Location模型,但如果location_id不是null,那么user->location_id的值将被更新为null