Laravel 5.4 在删除时从中间表中解除关联记录。

10 浏览
0 Comments

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()方法不会触发模型观察者。

0
0 Comments

问题:Laravel 5.4在删除时如何从pivot中分离记录?

原因:模型观察者只有在对模型执行操作时才会被调用。在删除操作中,使用的是查询构建器的delete()方法,因此模型并未被创建,因此模型观察者不会被触发。为了触发模型观察者,需要加载每个模型并对其进行单独的删除操作。

解决方法:

//删除旧的提醒
$reminder->reminders()->get()->each(function ($child) {
    $child->delete();
});

注意事项:

首先,在提醒模型中需要定义$events属性:protected $events = ['deleting' => ReminderObserver::class];

其次,需要使用composer dump-autoload命令来使观察者被找到。

0