在 Laravel 5.3 中写入嵌套 Select 查询

Write Nested Select Query in Laravel 5.3

如何在 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 查询生成器帮我写这个。

这是你的答案。

$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();

@Punit Gajjar 提供了一种解决方案,但这并不是您的问题所给出的术语 Query Builder。他的解决方案会起作用,但它有一半没有使用查询生成器(它只是一个 copy/paste 并将你的 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)中的参数是查询构建器实例。