【问题标题】:How can I use soft deleted with relation如何使用关系软删除
【发布时间】:2018-10-17 04:17:54
【问题描述】:

我使用 eloquent 和软删除。我收到错误,因为我的查询仍然选择已经使用软删除的数据,这里是我的模型

用户模型

class User extends Authenticatable
{
    use Notifiable, HasRoles, SoftDeletes;
    protected $guard_name = 'web';
    protected $fillable = [
        'username', 'password'
    ];
    protected $dates = ['deleted_at'];

}

例如,我有 100 个用户,我用 softdelete 删除了 1 个用户。然后我尝试

$a = User::all();
dd($a);

我有 99 个用户。有用!但是在我使用它之后,我所做的在这里不起作用

这是我的父表和模型

表格

 |id|user_id|parent_id|

注意 : user_id 和 parent_id 在 user.id 表中是 FK

class Parent extends Model
{
    protected $table = 'parent';
    public function user()
    {
        return $this->belongsTo('App\User');
    }

}


$getParent = Parent::with('user')->get();

当我dd($getParent); 时,为什么我仍然从我已经使用软删除的 user_id 获得空数据?

更新模型用户:在我放 whereNull 之后,我仍然得到我已经软删除的用户

public function user()
{
    return $this->belongsTo('App\User')->whereNull('users.deleted_at');
}

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    https://laravel.com/docs/5.7/eloquent#querying-soft-deleted-models

    ...
        public function customerAddress()
        {
            return $this->hasOne(Addresses::class, "id", "id_address")->withTrashed();
        }
    ...
    

    【讨论】:

      【解决方案2】:

      好的,这就是我认为正在发生的事情......

      使用软删除时,ondelete 事件不起作用(意味着相关模型不会被删除)。我不确定 Laravel 的更高版本是否改变了这种情况,但我不这么认为。同样删除 User 仍然不会影响父模型,因为您尚未定义 User 和 Parent 之间的关系(在 User 模型中),仅在 Parent 和 User 之间。

      尝试在 User 中定义关系,然后覆盖 Model 类中的 boot() 函数。 (这是未经测试的代码,但这样的事情应该可以完成)

      class User extends Authenticatable
      {
          use Notifiable, HasRoles, SoftDeletes;
          protected $guard_name = 'web';
          protected $fillable = [
              'username', 'password'
          ];
          protected $dates = ['deleted_at'];
      
          // Override Model boot function
          protected static function boot()
          {
              parent::boot();
      
              static::deleting(function ($users) {
                  foreach ($users->parents()->get() as $parent) {
                      $parent->delete();
                  }
              });
          }
      
          // Define relationship with parent model
          public function parents()
          {
              $this->hasMany('App\Parent');
          }
      }
      

      【讨论】:

      • 谢谢你的工作,但是在父模型中是否有覆盖 boot() 函数?因为在许多查询中我从父模型开始
      • @TryHardz 你的意思是从父模型开始?如果您要删除父模型,则可能无论如何都不应该从中删除用户模型,因为它是一对多的关系。我不知道你的代码看起来如何。但是如果你想从父级中删除用户,只需从父级获取用户模型,然后在用户上调用删除函数。 $parent = Parent::find($parentId); $user = User:.find($parent->user_id); $用户->删除();或类似的东西。
      • 您当然可以覆盖 Parent 中的 boot() 函数并添加代码以删除相关的 User 模型。但我个人认为这是不好的做法。如果属于另一个模型的模型会删除它所属的模型,然后该模型又会删除第一个模型兄弟姐妹,那会感觉有点违反直觉。
      • 所以当我已经使用 static::delet 时我无法恢复这些数据,对吧?
      • @TryHardz 如果您的模型设置为软删除,您应该可以恢复它
      【解决方案3】:

      您可以对 Eager Load 施加约束:

      public function groups()
      {
      
          return $this
          ->belongsToMany('Group')
          ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at`
          ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at`
      
      }
      

      使用以下方式删除关系,而不是硬删除关系:

      User::find(1)->groups()->detach();
      

      你应该使用这样的东西来代替软删除:

      DB::table('group_user')
      ->where('user_id', $user_id)
      ->where('group_id', $group_id)
      ->update(array('deleted_at' => DB::raw('NOW()')));
      

      【讨论】:

      • 在我放 $this->belongsTo('App\User')->whereNull('users.deleted_at'); 之后我仍然得到相同的价值
      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      相关资源
      最近更新 更多