2016-07-09 118 views
1

我現在的模型有一些關係。我怎樣才能刪除它們,以防模型被刪除? 該查詢不會刪除相關模型,只會刪除「主要模型」。laravel5.2刪除所有關係的模型

我用這個代碼來調用:

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

這是我目前的檢查模式

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

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

結果與檢查包含每個檢查多個項目。這意味着要清楚:

一個支票可能有CheckResult,並可能有CheckProcedure(我當然會刪除所有這些)。

+0

您在查詢生成器上調用'delete',而不是模型。如果你想要一個模型事件被觸發,你必須在模型上調用它。如果你只是在db上執行刪除語句,也不知道急切的加載是什麼。 – lagbox

回答

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(); 
} 

希望這有助於。

+0

我更新了上面的代碼,不起作用。只有主要模型被刪除。 –

+0

確保通過在裏面添加'dd()'或'log'來觸發該方法。 –

0

就像已經在註釋中指出的那樣,您正在查詢生成器上執行刪除操作,而不是實際的相關模型。即

你應該有

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

什麼,而不是你目前有。

另外,假設您使用關係數據庫,正確的方法是使用foreign keys with cascade delete action

+0

上面的代碼再次被編輯。不起作用。 –

+0

你沒在找。 'checks-> delete()'not'checks() - > delete()' –