DOCTRINE异常:无明显原因导致查询结果数量变化
问题根源:变量指向的对象完全不同!
你遇到的这个“奇怪”问题其实是个典型的变量赋值误解,咱们拆解来看:
第一种链式调用的逻辑
这段代码里,$query最终被赋值为getResult()的返回值:
$query = $this->createQueryBuilder('s') ->select('s') ->leftJoin('s.Cluster', 'u') ->where('u.id = 15') ->orWhere('u.id=37') ->getQuery() ->getResult(); var_dump(count($query));
getResult()会返回查询得到的实体数组,所以count($query)统计的是数组里的元素数量,得到2是符合预期的正确结果。
第二种拆分写法的问题
而这段代码里,$query指向的是QueryBuilder实例,不是查询结果:
$query = $this->createQueryBuilder('s') ->select('s') ->leftJoin('s.Cluster', 'u') ->where('u.id = 15') ->orWhere('u.id=37'); $query->getQuery()->getResult(); // 这里执行了查询,但结果没存下来 var_dump(count($query));
你调用了getQuery()->getResult()但没有把返回的结果数组赋值给任何变量,$query仍然是QueryBuilder对象。此时count($query)在PHP里会统计这个对象的可访问属性数量(具体数值取决于QueryBuilder的内部结构),这和你期望的“查询结果数量”完全不是一回事,所以才会出现看起来毫无关联的数值变化。
修正后的写法
只需要把查询结果单独存到变量里,再统计数量就可以了:
// 用更清晰的变量名区分QueryBuilder和结果 $qb = $this->createQueryBuilder('s') ->select('s') ->leftJoin('s.Cluster', 'u') ->where('u.id = 15') ->orWhere('u.id=37'); $result = $qb->getQuery()->getResult(); var_dump(count($result)); // 这里会得到正确的2
内容的提问来源于stack exchange,提问作者Lilian Barraud
相关产品推荐
相关产品推荐

