2017-01-31 19 views
2

自分自身の間で2つの関連テーブルのデータを削除しようとしています。私はウェブサイト表の行を削除するときに、私はまた、外部キー

ウェブサイト
IDと関連しているキーワードテーブル内の行を削除したいです|サイト名同時に2つの関連するテーブルでLaravelを削除します

1 |例

キーワード
id |ウェブサイト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'); 
} 

モデルWebsite.php

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

答えて

2

一つ、あなたのWebsiteモデルにboot機能に結合し、その後、あなたのインスタンスを提供deletedイベントをキャプチャするために私たちを利用することができ迅速な方法最初の引数として削除されているモデル($website)

ここでは例です:

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

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

エラー:私は移動、静的であると機能を更新しましたR.Jonson @クラスのApp \ウェブサイト –

+0

の静的メソッドを照らし\データベース\雄弁\モデル::ブーツ()非静的を作ることはできません速過ぎる。謝罪。 – Ohgodwhy

+1

素晴らしい!できます。ありがとうございました。そのエラーで申し訳ありませんが、私も関数が静的ではなかったことを見ていませんでした。もう一度感謝します。 –

7

これを達成するための最良の方法は、外部キー制約を定義するときonDelete('cascade')を使用することです:

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

だから、あなたはすべてのキーワードは、関連、ウェブサイトを削除しますとき自動的に削除されます。

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

+0

私はこのようになりたいです。私はそれを試して、私はcreate_keywords_table.phpの移行で同じコードを書いたが、動作しませんでした。どうしてか分かりません。 –

+0

私は実際にこれをupvotedし、私が提供した答えとしてこのメ​​ソッドを好むでしょうが、時には、移行に慣れていない初心者または外部キー制約がどのように働くのかをブートメソッドにバインドする方が簡単です。それでも、+1とこの回答を探している人は、スキーマパターンをこのように見せて、アプリケーションが適切なデータベース設計をエミュレートする必要がないようにする必要があります。 – Ohgodwhy

+0

私は同意しますが、この方法は私の場合は動作しません。私は試しましたが、うまくいきません。しかし、私はこれを棄却した。 –

関連する問題