我正在尝试覆盖模型上的删除方法。
在我的用户模型中,我有这样的代码:
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_id
是null
),当你删除任何Location
模型,但如果location_id
不是null
,那么user->location_id
的值将被更新为null
。