【问题标题】:Laravel 5.4 Detach record from pivot on deleteLaravel 5.4 在删除时从枢轴中分离记录
【发布时间】:2017-09-30 05:09:39
【问题描述】:

我有一个提醒表,它本身具有一对多关系, 所以我有这张表:
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();
    }
}

并将其添加到应用服务提供者:

 public function boot()
{
    //...
    Reminder::observe(ReminderObserver::class);
}

但是,到目前为止,当我执行此事务时,reminder_user 表中的记录并没有被删除:

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

【问题讨论】:

标签: php laravel eloquent laravel-5.4 laravel-eloquent


【解决方案1】:

模型观察者仅在对模型执行操作时被调用。

您的删除电话:

//delete old reminders
$reminder->reminders()->delete();

这是在查询构建器上调用delete(),因此不会创建模型,因此不会触发模型观察者。您需要加载每个模型并单独调用 delete 以触发模型观察器:

//delete old reminders
$reminder->reminders()->get()->each(function ($child) {
    $child->delete();
});

【讨论】:

  • 这行得通,谢谢。请注意:首先,提醒模型中缺少 $event 定义:protected $events = ['deleting' => ReminderObserver::class]; 第二:我需要一个 composer dump-autoload 才能找到观察者。
猜你喜欢
  • 2017-12-16
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2019-04-02
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多