Eloquent查询问题:筛选指定出版物下的公开及指定用户私有文章
解决Eloquent查询的条件组合问题
我明白你的需求啦——要筛选出指定出版物下的两类文章:所有用户的公开文章,加上指定用户发布的私有文章。你的原查询逻辑出在条件的组合方式上,咱们来一步步修正它。
问题分析
你原来的代码把所有条件用AND连在了一起,相当于要求文章同时满足:
- 属于指定出版物
- 是公开的(
is_private: false) - 属于当前用户且是私有的(
is_private: true)
这显然是矛盾的,自然查不到正确结果。咱们需要的是两个条件的OR关系:要么是该出版物下的公开文章,要么是该出版物下指定用户的私有文章。
正确的查询代码
$targetUserId = 1; // 替换为你需要指定的用户ID,也可以用auth()->id()获取当前用户 $publicationId = // 你的目标出版物ID $posts = Post::where('publication_id', $publicationId) ->where(function ($query) use ($targetUserId) { // 第一个条件:该出版物下的所有公开文章 $query->where('is_private', false) // 第二个条件:该出版物下指定用户的私有文章,用OR连接两个分支 ->orWhere(function ($subQuery) use ($targetUserId) { $subQuery->where('user_id', $targetUserId) ->where('is_private', true); }); }) ->get();
逻辑说明
- 首先用
where('publication_id', $publicationId)限定所有结果都属于目标出版物; - 外层闭包用
where()包裹,内部通过orWhere()实现二选一的逻辑:- 分支1:
is_private为false,即所有公开文章; - 分支2:
user_id匹配指定用户,且is_private为true,即该用户的私有文章;
- 分支1:
- 这样整个查询就会返回符合任意一个分支条件的文章,正好满足你的需求——比如指定userId为1时,会返回Title 1(用户1的私有文章)和Title 2(公开文章)。
内容的提问来源于stack exchange,提问作者Helder Lucas
相关产品推荐
相关产品推荐

