我有一个Task
课程。并且该表的每个记录可以有一个或多个孩子,并且可以是另一个任务的一个或多个父母。
表任务
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();
但我以下是行不通的
foreach ($task->parents() as $parent) {
$parent->delete();
}
有没有办法使用links
和parents
函数删除childs
而不是直接在数据库中搜索?
答案 0 :(得分:1)
希望这有效
$task =Task::find($id);
$task->childs()->detach();
$task->parents()->detach();
$task->delete();
答案 1 :(得分:0)
在这些情况下我通常做的是,在设计数据库时,我编写了一个迁移并设置了我希望受级联影响的列。
实施例
php artisan make:migration cascade_implementation
并在Up()上设置我想要受影响的任何内容,在Down()上设置反向,以防需要回滚。在你的情况下,像(或者反过来,取决于你的需要):
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');
});
}
了解详情
答案 2 :(得分:0)
执行此操作的最快方法..如果每次删除任务时都要删除所有关系,则应将其包含在任务迁移中
$table->foreign('the_foreign_key')->references('related_table_primary_key')->on('table_name_related')->onDelete('cascade');
每次删除关系上的任务都将被删除。