2016-05-19 51 views
1

除去所選擇的模型我有一個Lesson模型以下字段:有這些領域自動刪除相關車型在laravel

lesson_id 
title 
start_date 
end_date 

並有Content模型:

content_id 
lesson_id 
contentable_id 
contentable_type 
order 

一個一對多關係介於LessonContent之間。

另外,我有一個名爲Unit這些所在領域的兩個另一型號:

unit_id 
title 
time 

而且Test這些:

test_id 
title 
description 

內容contentable_typecontentable_id屬性持有相關單位(或測試)數據到特定的課程。

例如,在內容的contentable_type字段可以插入只應用\單位應用\測試串和contentable_id認爲單位或測試的ID。

(要小心,內容模型不是爲了創造這些表之間的變形關係,我創造了它東陽我想給訂貨能力的單位和測試課)

現在,假設我想刪除特定內容和相關單元(或測試)。

刪除內容模型實例很容易,但要刪除相關單元(或測試),我必須從contentable_type中獲取適當的型號名稱,然後選擇並刪除它。

對於我寫了這個:

public function destroy ($course_id, $lesson_id, $content_id) 
{ 
    $content = Content::findOrFail($content_id); 
    $modelName = $content->contentable_type; 

    $modelName::find($content->contentable_id)->delete(); 
    $content->delete(); 
} 

儘管工作正常,但我認爲這不是方便。 我搜索一種方式,當刪除內容模型時,這會自動找到相關模型並將其刪除。

什麼是最好的和正確的解決方案?

+0

您可以在遷移時添加外鍵約束並添加onDelete級聯,因此刪除將自動保留在數據庫級別。在這裏閱讀更多 - https://laravel.com/docs/5.2/migrations#foreign-key-constraints – naneri

+0

Sice相關模型名稱保留'contentable_type'字段作爲字符串我無法使用外鍵優點。如果可以在這種情況下指導我。 –

+0

對不起,我的壞,沒有注意到 – naneri

回答

0

在這種情況下,我只是做這些改變:

public function destroy ($course_id, $lesson_id, $content_id) 
     { 
      $content = Content::findOrFail($content_id); 
      $content->delete(); 
     } 

並在內容型號:

public static function boot() 
     { 
      static::deleting(function ($content) { 

       $modelName = $content->contentable_type; 
       $modelName::find($content->contentable_id)->delete(); 
      }); 
     } 

這工作得很好。 但要做到最好,最正確的解決方案?