我用雄辩的方式进行软删除。由于我的查询仍然选择了已经使用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');
}
答案 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();
}
...