在Laravel 5.3中编写嵌套选择查询

时间:2016-11-11 05:08:59

标签: sql laravel laravel-5.2 laravel-query-builder

如何在Laravel 5.3中编写复杂查询?我正在努力,但没有得到我期望的结果。

查询

SELECT * FROM (SELECT posts.post_id 
FROM posts 
WHERE ((posts.user_id = 1 AND posts.user_type = 'user') 
    OR (posts.user_id IN (1) AND posts.user_type = 'page'))) posts 
    WHERE posts.post_id > '0' ORDER BY posts.post_id DESC

请帮我用Laravel Query Builder来写这个。

2 个答案:

答案 0 :(得分:1)

@Punit Gajjar提供了一种解决方案,但这与 Query Builder 这个术语完全不同。他的解决方案可以工作,但是有一半没有使用查询生成器(它只是复制/粘贴并将您的SQL放入原始查询中,这与您之前使用的基本相同),因此我觉得有必要为您提供其他选择:

Post::where('post_id', '>', 0)
    ->where(function($query) {

       $query->where(function($subquery) {
           $subquery->where('user_id', 1)->where('user_type', 'user');
       })->orWhere(function($subquery) {
           $subquery->whereIn('user_id', [1])->where('user_type', 'page');
       });

    })
    ->orderBy('post_id', 'DESC')
    ->get();

为了便于阅读,我将变量名保持简短,但是匿名函数($query$subquery)中的参数是查询生成器实例。

答案 1 :(得分:0)

这是你的答案。

$MyQuery = DB::table(DB::Raw("(SELECT
                               posts.post_id
                               FROM
                               posts
                               WHERE
                               (
                                 (
                                   posts.user_id = 1
                                   AND posts.user_type = 'user'
                                  )
                                  OR 
                                  (
                                    posts.user_id IN (1)
                                    AND posts.user_type = 'page'
                                   )
                                )
                                )"))
            ->where('posts.post_id','>',"0")->orderBy("posts.post_id" , "DESC")->get();

尝试使用->toSql()这样打印查询

echo $MyQuery = DB::table(DB::Raw("(SELECT
                                    posts.post_id
                                    FROM
                                    posts
                                    WHERE((
                                           posts.user_id = 1
                                           AND posts.user_type = 'user'
                                           )
                                           OR(
                                           posts.user_id IN (1)
                                           AND posts.user_type = 'page'
                                           )))"))
            ->where('posts.post_id','>',"0")->orderBy("posts.post_id" , "DESC")->toSql();

            die();