繁体   English   中英

Laravel 通过 BelongsToMany 关系删除

[英]Laravel delete by BelongsToMany relationship

我有一个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通过parentschilds功能,而不是直接在数据库中搜索?

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

执行此操作的最快方法.. 如果每次删除任务时都想删除所有关系,则应将其包含在任务迁移中

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

每次删除关系上的任务都会被删除。

对于这些情况,我通常做的事情是,在设计数据库时,我会写一个迁移并设置我希望受到级联影响的列。

示例

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

https://laravel.com/docs/5.5/migrations阅读更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM