2017-10-16 178 views
0

我有一個Task類。此表中的每個記錄可以有一個或多個孩子,可以是另一個任務的一個或多個父母。Laravel刪除BelongsToMany relationship

任務

id | name 

tasks_links

parent_id | child_id 

任務模型

<?php 

namespace App; 

class Task extends Model 
{  
    public function childs() 
    { 
     return $this->belongsToMany(Task::class, 'tasks_links', 'parent_id','child_id'); 
    } 

    public function parents() 
    { 
     return $this->belongsToMany(Task::class, 'tasks_links' , 'child_id' , 'parent_id'); 
    } 
} 

在我的控制器和視圖 我可以使用像

Task::find($id)->parents(); //Return an array 

當我刪除任務的關係,我也想刪除的鏈接與其他相關任務

所以下面的工作:

\DB::table('tasks_links')->where('parent_id' , $task->id)->delete(); 
\DB::table('tasks_links')->where('child_id' , $task->id)->delete(); 

但我下面不working

foreach ($task->parents() as $parent) { 
     $parent->delete(); 
    } 

有什麼辦法可以刪除links by usi函數parentschilds而不是直接在數據庫中搜索?

回答

2

希望這個作品

$task =Task::find($id); 
$task->childs()->detach(); 
$task->parents()->detach();  
$task->delete(); 
+0

不幸的是,它不工作: -/ – Raccoon

+0

$ task-> childs() - > detach() –

+0

太棒了!感謝您編輯您的答案 – Raccoon

0

我通常做這些情況是,在設計數據庫的時候,我寫了遷移,並設置我想通過級聯影響哪些列什麼。

php artisan make:migration cascade_implementation 

並在向上()我設置任何我希望受到影響,上向下()我設置的倒數,在需要回滾的情況下。在你的情況,像(或周圍的其他方法,根據您的需要):在多https://laravel.com/docs/5.5/migrations

0

這樣做的最快方法

public function up() 
{ 
Schema::table('tasks', function (Blueprint $table) { 
    $table->foreign('parent_id') 
     ->references('id')->on('tasks_links') 
     ->onDelete('cascade'); 
    $table->foreign('child_id') 
     ->references('id')->on('tasks_links') 
     ->onDelete('cascade'); 
}); 
} 

閱讀..如果每次你刪除一個任務中,你將要刪除你的任務遷移

$table->foreign('the_foreign_key')->references('related_table_primary_key')->on('table_name_related')->onDelete('cascade');

每次你刪除關係的任務將被刪除的所有關係你應該包括這個。