You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑说明

  1. 首先用where('publication_id', $publicationId)限定所有结果都属于目标出版物;
  2. 外层闭包用where()包裹,内部通过orWhere()实现二选一的逻辑:
    • 分支1:is_private为false,即所有公开文章;
    • 分支2:user_id匹配指定用户,且is_private为true,即该用户的私有文章;
  3. 这样整个查询就会返回符合任意一个分支条件的文章,正好满足你的需求——比如指定userId为1时,会返回Title 1(用户1的私有文章)和Title 2(公开文章)。

内容的提问来源于stack exchange,提问作者Helder Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:48:00