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

Laravel双关联计数对比查询返回空结果问题求助

问题分析与解决方案

你遇到的问题核心是**has()方法的用法完全错了**,导致查询条件根本不符合你的预期,所以返回了null。咱们一步步拆解:

原代码的问题

你写的has('streams', '!=', 'items'),Laravel会把它解析成:

筛选出streams关联的数量 不等于字符串'items' 的服务器

这显然不是你要的——你想比较的是streams_count和items_count这两个统计值的差异,但has()是用来检查单个关联是否存在/数量是否符合条件的,没法直接跨关联比较统计值。

正确的写法:用havingRaw或DB::raw比较统计列

因为withCount()已经帮你生成了streams_count和items_count这两个计算列,你需要在having子句里直接比较这两个列的值。这里有两种靠谱的写法:

写法1:使用havingRaw(最直观)

$server = Server::withCount(['streams', 'items'])
    ->havingRaw('streams_count != items_count')
    ->orderBy('streams_count', 'desc')
    ->first();

写法2:使用having配合DB::raw

如果更习惯用链式的having方法,需要用DB::raw()告诉Laravel这是一个列名,不是字符串值:

use Illuminate\Support\Facades\DB;

$server = Server::withCount(['streams', 'items'])
    ->having('streams_count', '!=', DB::raw('items_count'))
    ->orderBy('streams_count', 'desc')
    ->first();

为什么你之前试having()可能没成功?

如果之前你直接写having('streams_count', '!=', 'items_count'),Laravel会把'items_count'当成一个字符串常量,相当于执行了streams_count != 'items_count'——你的streams_count是0,0和字符串'items_count'的比较结果不符合预期,所以没匹配到数据。

用上面两种写法,就能正确比较两个统计列的数值,匹配到你想要的那条服务器记录了。

内容的提问来源于stack exchange,提问作者Cory Fail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:18:08