Laravel 5.4 删除时从数据透视表中分离记录
Laravel 5.4 Detach record from pivot on delete
我有一个提醒 table,它本身具有一对多关系,
所以我有这个 table:
id: 主键
reminder_id: 我的外键提醒table
这样我就可以有一个带有键 id=1
的记录,以及许多其他用 reminder_id=1
.
引用它的记录
我还有一个用户 table,有他的 ID,还有一个 reminder_user 来处理多对多关系。
这种关系运作良好,因此我可以从用户那里检索他的提醒,从提醒他的 children 提醒等等。
提醒型号:
class Reminder extends Model {
public function users() {
return $this->belongsToMany("App\Models\User");
}
public function reminder() {
return $this->belongsTo("App\Models\Reminder");
}
public function reminders() {
return $this->hasMany("App\Models\Reminder");
}
}
用户型号:
class User extends Authenticatable
{
use Notifiable;
public function reminders() {
return $this->belongsToMany("App\Models\Reminder");
}
}
我的问题是,当我更新提醒时,我的数据透视表 table reminder_user 中的记录没有被删除。
我试图创建这个观察者:
namespace App\Observers;
use App\Models\Reminder;
class ReminderObserver {
public function deleting(Reminder $reminder)
{
$reminder->users()->detach();
}
}
并将其添加到应用服务提供商:
public function boot()
{
//...
Reminder::observe(ReminderObserver::class);
}
但是,到目前为止,当我进行此交易时,reminder_user table 中的记录没有被删除:
DB::transaction(function()use($reminder, $repeated, $user) {
//delete old reminders
$reminder->reminders()->delete();
//add many new reminders
$reminder->reminders()->saveMany($repeated);
//save new relation with user
$user->reminders()->saveMany($repeated);
//update current reminder
$reminder->save();
});
更新
从答案来看,问题是在查询构建器上调用 delete() 不会触发模型观察器。
仅当对模型执行操作时才会调用模型观察器。
您的删除电话:
//delete old reminders
$reminder->reminders()->delete();
这是在查询构建器上调用 delete()
,因此不会创建模型,因此不会触发模型观察器。您将需要加载每个模型并单独对其调用 delete 以便您的模型观察者触发:
//delete old reminders
$reminder->reminders()->get()->each(function ($child) {
$child->delete();
});
我有一个提醒 table,它本身具有一对多关系,
所以我有这个 table:
id: 主键
reminder_id: 我的外键提醒table
这样我就可以有一个带有键 id=1
的记录,以及许多其他用 reminder_id=1
.
我还有一个用户 table,有他的 ID,还有一个 reminder_user 来处理多对多关系。
这种关系运作良好,因此我可以从用户那里检索他的提醒,从提醒他的 children 提醒等等。
提醒型号:
class Reminder extends Model {
public function users() {
return $this->belongsToMany("App\Models\User");
}
public function reminder() {
return $this->belongsTo("App\Models\Reminder");
}
public function reminders() {
return $this->hasMany("App\Models\Reminder");
}
}
用户型号:
class User extends Authenticatable
{
use Notifiable;
public function reminders() {
return $this->belongsToMany("App\Models\Reminder");
}
}
我的问题是,当我更新提醒时,我的数据透视表 table reminder_user 中的记录没有被删除。
我试图创建这个观察者:
namespace App\Observers;
use App\Models\Reminder;
class ReminderObserver {
public function deleting(Reminder $reminder)
{
$reminder->users()->detach();
}
}
并将其添加到应用服务提供商:
public function boot()
{
//...
Reminder::observe(ReminderObserver::class);
}
但是,到目前为止,当我进行此交易时,reminder_user table 中的记录没有被删除:
DB::transaction(function()use($reminder, $repeated, $user) {
//delete old reminders
$reminder->reminders()->delete();
//add many new reminders
$reminder->reminders()->saveMany($repeated);
//save new relation with user
$user->reminders()->saveMany($repeated);
//update current reminder
$reminder->save();
});
更新
从答案来看,问题是在查询构建器上调用 delete() 不会触发模型观察器。
仅当对模型执行操作时才会调用模型观察器。
您的删除电话:
//delete old reminders
$reminder->reminders()->delete();
这是在查询构建器上调用 delete()
,因此不会创建模型,因此不会触发模型观察器。您将需要加载每个模型并单独对其调用 delete 以便您的模型观察者触发:
//delete old reminders
$reminder->reminders()->get()->each(function ($child) {
$child->delete();
});