Laravel 5.1删除行时删除子关系数据

时间:2016-04-22 12:49:42

标签: php laravel laravel-5 laravel-5.1

我在Laravel 5.1中有一个应用程序,其中设置了以下表格;

  • 时间表
  • day_total
  • segment_totals

行属于时间表。 日总计属于时间表。 细分总计属于行。

删除时间表后,我还希望它删除rowday_totalsegment_total以及timesheet表本身的行。< / p>

我在timesheet模型中设置了以下启动方法;

/**
 * Boot the model.
 *
 */
public static function boot()
{
    parent::boot();

    static::deleting(function($timesheet)
    {
        $timesheet->row()->delete();
        $timesheet->dayTotal()->delete();
    });
}

我在row模型中设置了以下内容;

/**
 * Boot the model.
 *
 */
public static function boot()
{
    parent::boot();

    static::deleting(function($row)
    {
        $row->day()->delete();
        $row->segmentTotal()->delete();
    });
}

删除时间表后,rowdayTotal行将被删除,但daysegmentTotals不会被删除。如何让Laravel在row模型上触发删除?

1 个答案:

答案 0 :(得分:0)

当您在关系查询上调用delete()时,它会对数据库运行直接查询以删除记录。因此,不会加载相关模型,并且无法调用这些模型上的deleting事件。您需要以可以调用相关模型上的事件的方式删除记录。

您需要遍历相关模型并在每个模型实例上调用delete(),或者您可以获取相关ID的列表,然后使用destroy()方法(仅加载每个ID的模型,并在其上调用delete()

选项1:循环通过相关模型

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

    static::deleting(function($timesheet)
    {
        foreach($timesheet->row()->get() as $row) {
            $row->delete();
        }
        foreach($timesheet->dayTotal()->get() as $dayTotal) {
            $dayTotal->delete();
        }
    });
}

选项2:将destroy()与ids:

一起使用
public static function boot()
{
    parent::boot();

    static::deleting(function($timesheet)
    {
        // getRelated() method gets the related model from the relationship.
        // This is so you don't have to hardcode \App\Row::destroy()
        // or \App\DayTotal::destroy()

        $ids = $timesheet->row()->lists('id')->all();
        $timesheet->row()->getRelated()->destroy($ids);

        $ids = $timesheet->dayTotal()->lists('id')->all();
        $timesheet->dayTotal()->getRelated()->destroy($ids);
    });
}