Symfony Doctrine Mongo ODM QueryBuilder仅返回首个文档问题排查
多对多关联查询异常:仅返回第一个匹配员工的解决办法
问题根因
你当前的查询直接将Invoice实体对象传入in()方法,但MongoDB存储的是发票的ObjectId,Doctrine ODM不会自动将实体对象转换为对应ID进行匹配,这就导致查询条件匹配异常,只返回了第一个符合的员工。
修正后的查询代码
方式一:直接用发票ID查询(最简单)
既然数据库中存储的是ID,直接提取发票的ID作为匹配条件即可。因为你要找的是关联单张指定发票的员工,用equals()比in()更合适(in()多用于匹配多个值的场景):
public function findEmployeeByInvoiceQuery(Invoice $invoice) { $dm = $this->getDocumentManager(); $query = $dm->createQueryBuilder(Employee::class) ->field('invoices')->equals($invoice->getId()); return $query->getQuery()->execute(); }
方式二:用Doctrine文档引用查询(符合ORM规范)
如果想严格遵循Doctrine的对象引用机制,可以先创建发票的文档引用,再执行查询:
public function findEmployeeByInvoiceQuery(Invoice $invoice) { $dm = $this->getDocumentManager(); $invoiceRef = $dm->getReference(Invoice::class, $invoice->getId()); $query = $dm->createQueryBuilder(Employee::class) ->field('invoices')->equals($invoiceRef); return $query->getQuery()->execute(); }
额外检查点
确认Doctrine多对多关系的映射配置正确,避免因映射问题导致的查询异常:
Employee实体中invoices字段的映射:@MongoDB\ReferenceMany(targetDocument=Invoice::class, mappedBy="employees")Invoice实体中employees字段的映射:@MongoDB\ReferenceMany(targetDocument=Employee::class, inversedBy="invoices")
内容的提问来源于stack exchange,提问作者s.khan
相关产品推荐
相关产品推荐

