我在Laravel 5.1中有一个应用程序,其中设置了以下表格;
行属于时间表。 日总计属于时间表。 细分总计属于行。
删除时间表后,我还希望它删除row
,day_total
和segment_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();
});
}
删除时间表后,row
和dayTotal
行将被删除,但day
和segmentTotals
不会被删除。如何让Laravel在row
模型上触发删除?
答案 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);
});
}