在网络应用程序中,我模拟了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
匹配,而不是加入护理人员表。
背景
有关详细信息,请参阅我的(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仅连接关系表而不连接看护者表?
答案 0 :(得分:0)
听起来你想要这个......
->setParameter('caregiver', $caregiver);
......使用看护人id
。现在它将caregiver
参数设置为实体对象,这会导致您看到的错误。
那怎么样:
->setParameter('caregiver', $caregiver->getId());
这当然假设您的看护者实体中有一个'id'getter方法。您可能需要执行$caregiver->id
,具体取决于您通常如何访问实体数据。