Laravel一对多关系中whereHas/orWhereHas搭配!=查询不生效问题
问题分析与解决方案
你的查询逻辑存在漏洞,导致结果不符合预期:
- 原代码里的
orWhereHas('baskets', function($query) { $query->where('id', '!=', 1); })逻辑是只要国家关联的篮子里存在至少一个ID不是1的篮子,就会被选中。如果某个国家同时关联了ID=1和ID=2的篮子,这个条件依然成立,所以该国家会被错误地包含在结果里。 - 你实际需要的是从未关联过ID=1的篮子的国家,包含两类:完全没有关联任何篮子的国家,以及关联了其他篮子但唯独没关联ID=1的国家。
正确写法可以直接用whereDoesntHave并指定条件,一次性覆盖两种情况:
$countries = Country::whereDoesntHave('baskets', function($query) { $query->where('id', 1); })->get();
这个语句的核心逻辑是:筛选出所有不存在“ID=1的篮子”关联的国家,完全匹配你的需求。
至于多对多关系里类似逻辑能正常运行,是因为多对多的中间表结构与关联逻辑不同——多对多中你是检查中间表是否存在指定关联,而一对多里是直接检查子模型(Basket)的ID是否存在于关联集合中,判断对象不一样,所以不能直接照搬多对多的写法。
内容的提问来源于stack exchange,提问作者Stroomschok
相关产品推荐
相关产品推荐

