使用Doctrine优化多对多连接

时间:2014-01-03 14:35:36

标签: php join doctrine-orm associations

在网络应用程序中,我模拟了ClientCaregiver之间的关系。由于关系包含信息,因此将其建模为两个一对多关系(如脚注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仅连接关系表而不连接看护者表?

1 个答案:

答案 0 :(得分:0)

听起来你想要这个......

->setParameter('caregiver', $caregiver);

......使用看护人id。现在它将caregiver参数设置为实体对象,这会导致您看到的错误。

那怎么样:

->setParameter('caregiver', $caregiver->getId());

这当然假设您的看护者实体中有一个'id'getter方法。您可能需要执行$caregiver->id,具体取决于您通常如何访问实体数据。