【问题标题】:laravel5.2 delete model with all relationslaravel5.2 删除所有关系的模型
【发布时间】:2016-07-09 19:16:18
【问题描述】:

我当前的模型有一些关系。如果模型将被删除,我该如何删除它们? 此查询不会删除相关模型,只会删除“主模型”。

我用这段代码调用:

$checks = Check::where('created_at','<=', Carbon::now()
                 ->subHours(3))
                 ->with('checks')
                 ->with('results')
                 ->delete();

这是我目前的 Check 模型

protected static function boot(){
    parent::boot();

    static::deleting(function($check) {
        $check->checks()->delete();
        $check->results()->delete();
    });
}

每项检查的结果和检查包含多个条目。意思是说清楚:

一张支票可能有 n 个CheckResult,也可能有 n 个CheckProcedure(我当然也会全部删除)。

【问题讨论】:

  • 您在查询构建器而不是模型上调用 delete。如果要触发模型事件,则必须在模型上调用它。如果您只是在数据库上执行删除语句,也不确定急切加载的用途。

标签: php model laravel-5.2 relationship cascading-deletes


【解决方案1】:

尝试使用deleted 而不是deleting

protected static function boot(){
    parent::boot();

    static::deleted(function($check)
    {
        $check->checks()->delete();
        $check->results()->delete();
    });
}

还尝试从返回的集合中逐个对象解析:

foreach($check->checks as $check_object) {
    $check_object->delete();
}

希望这会有所帮助。

【讨论】:

  • 我更新了上面的代码,不起作用。只有主模型被删除。
【解决方案2】:

就像在 cmets 中已经指出的那样,您正在对查询构建器而不是实际的相关模型执行删除。即

你应该有

$check->checks->delete();
$check->results->delete();

而不是你目前拥有的。

此外,假设您使用的是关系数据库,正确的做法是使用foreign keys with cascade delete action

【讨论】:

  • 你没有看。 checks-&gt;delete() 不是 checks()-&gt;delete()
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 2015-02-28
相关资源
最近更新 更多