Laravel同时在两个相关表中删除

时间:2017-01-31 19:33:34

标签: mysql laravel models delete-row

我试图删除两个相关表格中的数据。因此,当我删除网站表格中的一行时,我还想删除关键字表中与外键相关的行



网站
id | SITENAME

1 |例如

关键字
id | website_id | kwName

1 | 1

因此,当我删除网站时,不会删除具有相同ID的行(website_id作为外键)。

我的删除代码是:
控制器

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

模型Keyword.php

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

Model Website.php

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

2 个答案:

答案 0 :(得分:7)

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

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

因此,当您删除网站时,与其相关的所有关键字都将自动删除。

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

答案 1 :(得分:2)

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

以下是一个例子:

public static function boot()
{
    parent::boot();

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