【问题标题】:Laravel overwrite delete method on hasMany relationshipLaravel覆盖hasMany关系上的删除方法
【发布时间】:2015-10-08 06:05:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    如果您希望使用模型方法(或触发模型事件),您需要遍历所有用户并单独删除每个用户,例如:

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

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

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

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      // 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();
                  }
              }
          });
      }
      

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

      【讨论】:

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