如何使用软删除与关系

时间:2018-10-17 04:17:55

标签: php laravel

我用雄辩的方式进行软删除。由于我的查询仍然选择了已经使用softdelete的数据,因此出现错误

用户模型

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表中的user_id和parent_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放到null之后,我仍然得到我已将其软删除的用户

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

3 个答案:

答案 0 :(得分:1)

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

使用软删除时,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');
    }
}

答案 1 :(得分:0)

您可以对急切负载施加约束:

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`

}

使用以下方法代替HARD删除关系:

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

您应该使用类似这样的方式来SOFT Delete:

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

答案 2 :(得分:0)

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

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