2016-04-22 23 views
0

Laravel 5.1には、次の表が設定されているアプリケーションがあります。Laravel 5.1行が削除されたときのサブリレーションシップデータの削除

  • タイムシート
  • day_total
  • segment_totals

行は、タイムシートに属します。 日合計はタイムシートに属します。 セグメント合計は行に属します。

タイムシートが削除されると、私もそれがtimesheetテーブル自体からrowday_totalsegment_totalからの行だけでなく、行を削除したいです。

私はtimesheetモデルで次のブート方法を設定しました。

/** 
* Boot the model. 
* 
*/ 
public static function boot() 
{ 
    parent::boot(); 

    static::deleting(function($timesheet) 
    { 
     $timesheet->row()->delete(); 
     $timesheet->dayTotal()->delete(); 
    }); 
} 

私はrowモデルで次のように設定しました。タイムシートを削除すると

/** 
* Boot the model. 
* 
*/ 
public static function boot() 
{ 
    parent::boot(); 

    static::deleting(function($row) 
    { 
     $row->day()->delete(); 
     $row->segmentTotal()->delete(); 
    }); 
} 

は、rowdayTotal行が削除されますが、daysegmentTotalsは削除されません。 rowモデルでLaravelを削除するにはどうすればよいですか?

+0

あなたはあなたのエンティティとの関係を投稿してください可能性がありMYSQLではお互いに関係がありませんか? – Cowwando

答えて

0

リレーションシップクエリでdelete()を呼び出すと、データベースに対して直接クエリが実行され、レコードが削除されます。このため、関連するモデルはロードされず、そのモデルのイベントは呼び出すことができません。関連モデルのイベントを呼び出すことができるようにレコードを削除する必要があります。

あなたは、関連するモデルをループする必要があると、各モデルインスタンスにdelete()を呼び出すか、関連IDのリストを取得した後、ちょうど各IDのためのモデルをロードし、delete()を呼び出すdestroy()方法を(使用しますかそれに)。

オプション1:関連するモデルをループ

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

    static::deleting(function($timesheet) 
    { 
     foreach($timesheet->row()->get() as $row) { 
      $row->delete(); 
     } 
     foreach($timesheet->dayTotal()->get() as $dayTotal) { 
      $dayTotal->delete(); 
     } 
    }); 
} 

オプション2:IDを持つ利用destroy():問題のあるモデルであると思われるので、

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

    static::deleting(function($timesheet) 
    { 
     // getRelated() method gets the related model from the relationship. 
     // This is so you don't have to hardcode \App\Row::destroy() 
     // or \App\DayTotal::destroy() 

     $ids = $timesheet->row()->lists('id')->all(); 
     $timesheet->row()->getRelated()->destroy($ids); 

     $ids = $timesheet->dayTotal()->lists('id')->all(); 
     $timesheet->dayTotal()->getRelated()->destroy($ids); 
    }); 
} 
関連する問題