如何在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来写这个。
答案 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();