Laravel同时删除两个相关表

Posted

技术标签:

【中文标题】Laravel同时删除两个相关表【英文标题】:Laravel delete in two related tables in the same time 【发布时间】:2017-06-17 09:17:24 【问题描述】:

我正在尝试删除它们之间的两个相关表中的数据。因此,当我删除 websites 表中的一行时,我还想删除 keywords 表中与外键相关的行网站 编号 |站点名称

1 |示例关键字 编号 |网站ID |关键字名称

1 | 1 因此,当我删除一个网站时,具有相同 id(website_id 作为外键)的行不会被删除。

我的删除代码是:Controller

public function destroy($id)
 
     $projects = Website::findOrFail($id);
     $projects->delete();

    return redirect()->route('projects.index')->with('alert-success','Data Has been Deleted!');

刀片

@foreach($projectss as $projects)

    <tr>

      <td>$no++</td>
      <td>$projects->siteName</td>
      <td>$projects->siteUrl</td>       


      <td>
        <form class="" action="route('projects.destroy',$projects->id)" method="post" enctype="multipart/form-data">
          <input type="hidden" name="_method" value="delete">
          <input type="hidden" name="_token" value=" csrf_token() ">
          <a href="route('projects.show',$projects->id)" class="btn btn-success">View</a>
          <a href="route('projects.edit',$projects->id)" class="btn btn-primary">Edit</a>
          <input type="submit" class="btn btn-danger" onclick="return confirm('Are you sure to delete this data');" name="name" value="delete">
        </form>
      </td>
    </tr>
  @endforeach

Model Keyword.php

public function website() 
    return $this->belongsTo('App\Website');

Model Website.php

public function keywords() 
    return $this->hasMany('App\Keyword');

【问题讨论】:

【参考方案1】:

一种快速方法,您可以利用我们绑定到您的Website 模型中的boot 函数,然后捕获deleted 事件,该事件为您提供一个正在被删除的模型实例作为第一个参数@ 987654324@.

这是一个例子:

public static function boot()

    parent::boot();

    static::deleted(function($website)
        $website->keywords()->delete();
    );

【讨论】:

一个错误:不能使静态方法 Illuminate\Database\Eloquent\Model::boot() 在类 App\Website 中非静态 @R.Jonson 我已经将函数更新为静态,移动太快了。道歉。 太棒了!有用。谢谢你。对不起那个错误,我也没有看到这个函数不是静态的。再次感谢。【参考方案2】:

实现这一点的最佳方法是在定义外键约束时使用onDelete('cascade')

$table->foreign('website_id')->references('id')->on('websites')->onDelete('cascade');

所以当你删除一个网站时,所有与之相关的关键词都会被自动删除。

https://laravel.com/docs/5.4/migrations#foreign-key-constraints

【讨论】:

我想成为这样。我试过了,我在create_keywords_table.php迁移中写了同样的代码,但是没有用。我不知道为什么。 我实际上对此表示赞成,并且对于我提供的答案更喜欢这种方法,但是,对于不熟悉迁移或外键约束如何工作的初学者来说,有时绑定到引导方法更容易。尽管如此,+1 和任何其他搜索此答案的人都应该更喜欢他们的架构模式看起来像这样,因此应用程序不需要模拟正确的数据库设计。 我同意,但是这种方法不适用于我的情况。我试过了,但它不起作用。但是,我对此表示赞同。 @R.Jonson 您是否刷新了迁移或添加了重新定义外键的新迁移? 是的,更改行代码后,我刷新(php artisan migrate:refresh),所有记录都被删除了,但是它不起作用。

以上是关于Laravel同时删除两个相关表的主要内容,如果未能解决你的问题,请参考以下文章

两个多对多相关表之间的Laravel雄辩关系

在laravel中的两个相关模型中过滤

Laravel 5.5:使用 DatabaseMigrations 进行测试会删除所有表

laravel 关联查询 表一、表二、两个表的关联表

Laravel如何通过数据透视表获取相关字段列表

在 laravel 中插入关系