在我的问题答案项目中,管理员可以查看所有问题并删除每个问题,如果他愿意的话。但是一个问题id有5个相关表。也就是说,每个问题ID都存在于db中的5个表中,当admin删除一个问题时,我必须根据此问题ID删除这5个表中的所有条目。
在我的控制器中
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('AdminController@anyShowQuestions', array());
上面的代码可以工作但是有没有办法在laravel中的一个db查询中执行相同的过程。我已经提到了这个post,但找不到我的解决方案。如果有人提出正确的方法,它将是如此有用?
答案 0 :(得分:0)
您可以在此相关表格上正确设置外键。在迁移中创建密钥时添加onDelete('cascade')
,如果一切正常,那么当您删除问题时,它也会自动删除相关项目。
或强>
将DB::statement
表达式与相应的SQL查询一起使用。
示例:
DB::statement('update foo set bar=2');
您需要在纯SQL中解决您的任务,然后将生成的查询放在DB::statement
和中提琴中。
为了帮助您解决此问题,您可以阅读此article或此StackOverflow post
答案 1 :(得分: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
被删除时,所有已删除的User_Profile
也会被删除。