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

Laravel技巧:如何合并两个查询获取当前用户已删除消息

合并两个已删除消息查询的解决方案

嘿,我来帮你解决这个合并查询的问题!你现在有两个分别获取用户作为收件人和发件人已删除消息的查询,想要合并成一个结果集对吧?下面给你两种可行的方案:

方法一:使用Union合并查询

Laravel的查询构造器支持union()方法,可以把两个结构一致的查询结果合并到一起。需要注意的是,先不要给单个查询加paginate(),先构建基础查询,合并后再统一排序和分页:

// 构建收件人侧的已删除消息查询(暂不分页)
$query1 = $inbox->where('recipient', $user_id)
    ->where('trashed_in_recipient', 1)
    ->where('show_in_recipient', '!=', 1);

// 构建发件人侧的已删除消息查询(暂不分页)
$query2 = $inbox->where('sender', $user_id)
    ->where('trashed_in_sender', 1)
    ->where('show_in_sender', '!=', 1);

// 合并两个查询,排序后分页
$deletedMessages = $query1->union($query2)
    ->orderBy('created_at', 'desc')
    ->paginate($paginate);

注意:union()会自动去除重复的记录,如果你的业务场景允许保留重复(比如同一条消息同时满足两个条件的极端情况),可以改用unionAll()方法。

方法二:使用分组条件查询

另一种思路是把两个查询的条件用orWhere()分组包裹,这样只需要执行一次数据库查询,逻辑上更紧凑:

$deletedMessages = $inbox->where(function ($query) use ($user_id) {
        // 收件人侧的已删除条件组
        $query->where('recipient', $user_id)
            ->where('trashed_in_recipient', 1)
            ->where('show_in_recipient', '!=', 1);
    })
    ->orWhere(function ($query) use ($user_id) {
        // 发件人侧的已删除条件组
        $query->where('sender', $user_id)
            ->where('trashed_in_sender', 1)
            ->where('show_in_sender', '!=', 1);
    })
    ->orderBy('created_at', 'desc')
    ->paginate($paginate);

这里用闭包包裹条件组是为了避免逻辑错误——如果直接写where()->orWhere(),可能会和其他潜在的条件产生冲突,分组后逻辑更清晰。

两种方法都能帮你得到想要的最终结果,你可以根据自己的习惯和业务场景选择~

内容的提问来源于stack exchange,提问作者Andreas Hunter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:12:09