Laravel如何在一个查询中从多个表中删除一行

时间:2014-11-19 11:58:09

标签: php mysql laravel-4 delete-row

在我的问题答案项目中,管理员可以查看所有问题并删除每个问题,如果他愿意的话。但是一个问题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,但找不到我的解决方案。如果有人提出正确的方法,它将是如此有用?

2 个答案:

答案 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也会被删除。