【发布时间】:2014-01-03 14:35:35
【问题描述】:
在一个 Web 应用程序中,我为 Client 和 Caregiver 之间的关系建模。因为关系包含信息,所以这被建模为两个一对多关系(如脚注 here 中所述)。
模型是Client <-> Relation <-> Caregiver,要从特定的看护者那里查询所有客户,查询构建器的调用方式如下(在Client 的存储库中):
$qb = $this->createQueryBuilder('c');
$qb->leftJoin('c.relations', 'r')
->leftJoin('r.caregiver', 'ca')
->andWhere('ca.id = :id')
->setParameter('id', $caregiver->getId());
$qb->getQuery()->getResult();
优化
目前有效。但是,似乎没有必要加入护理人员,因为您可以简单地说 r.caregiver 应该匹配 $caregiver 对象。不幸的是,这不起作用:
$qb = $this->createQueryBuilder('c');
$qb->leftJoin('c.relations', 'r')
->andWhere('r.caregiver = :caregiver')
->setParameter('caregiver', $caregiver);
$qb->getQuery()->getResult();
这引发了一个致命错误:
可捕获的致命错误:Entity\Carer 类的对象无法转换为字符串
我想要实现的是,Doctrine 将 r.caregiver_id 匹配到 $caregiver_id,而不是加入 caregivers 表。
背景
有关更多信息,这是我的 (XML) 映射:
<entity name="Entity\Client" table="client" repository-class="Repository\Client">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="Entity\Relation" mapped-by="client" />
</entity>
<entity name="Entity\Relation" table="relation">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<many-to-one field="caregiver" target-entity="Entity\Caregiver" inversed-by="relations">
<join-column name="caregiver_id" referenced-column-name="id" />
</many-to-one>
<many-to-one field="client" target-entity="Entity\Client" inversed-by="relations">
<join-column name="client_id" referenced-column-name="id" />
</many-to-one>
</entity>
<entity name="Entity\Caregiver" table="caregiver">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="Entity\Relation" mapped-by="caregiver" />
</entity>
问题
如何从查询构建器中删除第二个连接,以便 MySQL 仅连接关系表而不连接 caregivers 表?
【问题讨论】:
标签: php join doctrine-orm associations