2014-11-19 4 views
0

В моем ответе на вопрос, у администратора есть возможность просмотреть все вопросы и удалить их, если захочет. но один идентификатор вопроса имеет 5 связанных таблиц. то есть каждый идентификатор вопроса присутствует в 5 таблицах в db, и когда администратор удаляет один вопрос, я должен удалить все записи из этих 5 таблиц на основе этого идентификатора вопроса.Laravel как удалить строку из нескольких таблиц в одном запросе

в мой контроллер

DB::table('user_questions')->where('question_id','=',$question_id)->delete(); 
DB::table('masters_answers')->where('question_id','=',$question_id)->delete(); 
DB::table('masters_questions')->where('question_id','=',$question_id)->delete(); 
DB::table('question_to_category')->where('question_id','=',$question_id)->delete(); 
DB::table('question_to_tags')->where('question_id','=',$question_id)->delete(); 
return Redirect::action('[email protected]', array()); 

Приведенный выше код работает, но есть ли способ сделать ту же самую процедуру в одном запросе дб ​​в Laravel.? я назвал это post, но не могу найти решение для моего. это будет так полезно, если кто-нибудь предложит правильный путь?

+0

Поскольку все записи связаны между собой, вы можете установить ограничения внешнего ключа и установить 'ON DELETE' в' CASCADE' – lukasgeiter

ответ

0

Вы можете правильно установить внешние ключи в этих связанных таблицах. Добавьте onDelete('cascade'), когда вы создаете ключи при переносе, и если все в порядке, то при удалении вопроса он автоматически удалит связанные элементы.

ИЛИ

Используйте выражение DB::statement с соответствующим запросом SQL.

Пример:

DB::statement('update foo set bar=2'); 

Вы должны решить свою задачу в простой SQL, а затем поместить полученный запрос в DB::statement и альт.

Чтобы помочь вам с запросом, вы можете прочитать это article или это StackOverflow post

0

Настройка внешних ключей по таблицам будет несомненно чистое решение

В качестве альтернативы, если вы не можете использовать внешние ключи, вы может использовать Model Events.

Каждая из ваших моделей запускает несколько событий, позволяя вам подключаться к различным точкам жизненного цикла модели, включая событие delete. Используйте что-то подобное в вашей модели:

class User extends Eloquent { 

    public static function boot() 
    { 
     //execute the parent's boot method 
     parent::boot(); 

     //delete your related models here, for example 
     static::deleted(function($user) 
     { 
      foreach($user->user_profiles as $profile) 
      { 
       $profile->delete(); 
      } 
     } 

    } 

} 

Теперь каждый раз, когда User будет удален, все atatched User_Profile Вайли быть также удален.