Laravel 5.4 在删除时从中间表中解除关联记录。
Laravel 5.4 在删除时从中间表中解除关联记录。
我有一个提醒表,它在自身上有一个一对多的关系,
所以我有这个表:
id: 主键
reminder_id: 指向提醒表的外键
这样我可以有一个键为id=1
的记录,还有许多其他记录,它们引用它的reminder_id=1
。
我还有一个用户表,有他的id,还有一个reminder_user来处理多对多的关系。
关系正常工作,所以我可以从用户那里检索他的提醒事项,从一个提醒事项那里检索他的子提醒事项,依此类推。
提醒模型:
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"); } }
我的问题是,当我更新一个提醒时,我的中间表reminder_user中的记录不会被删除。
我尝试创建这个观察者:
namespace App\Observers; use App\Models\Reminder; class ReminderObserver { public function deleting(Reminder $reminder) { $reminder->users()->detach(); } }
并将其添加到appservice提供者中:
public function boot() { //... Reminder::observe(ReminderObserver::class); }
但是,到目前为止,当我执行这个事务时,reminder_user表中的记录并没有被删除:
DB::transaction(function()use($reminder, $repeated, $user) { //删除旧的提醒事项 $reminder->reminders()->delete(); //添加许多新的提醒事项 $reminder->reminders()->saveMany($repeated); //保存与用户的新关系 $user->reminders()->saveMany($repeated); //更新当前提醒事项 $reminder->save(); });
更新
根据回答,问题是调用查询构建器上的delete()方法不会触发模型观察者。
问题:Laravel 5.4在删除时如何从pivot中分离记录?
原因:模型观察者只有在对模型执行操作时才会被调用。在删除操作中,使用的是查询构建器的delete()方法,因此模型并未被创建,因此模型观察者不会被触发。为了触发模型观察者,需要加载每个模型并对其进行单独的删除操作。
解决方法:
//删除旧的提醒 $reminder->reminders()->get()->each(function ($child) { $child->delete(); });
注意事项:
首先,在提醒模型中需要定义$events
属性:protected $events = ['deleting' => ReminderObserver::class];
其次,需要使用composer dump-autoload
命令来使观察者被找到。