1

私は教義の初心者であり、クエリを作成する方法を理解できません。

私はSymfony2を使用しており、2つのエンティティがあります:EquipmentDomain
それらは双方向のManyToManyによって関連付けられています。

私の中で私はに関連しDomainRepositoryたいです。DomainsEquipment

私はこれを試しましたが、何も返されません:

public function getDomainsRelatedToEquipment($id)
{   
    $qb = $this->createQueryBuilder('d');
    $qb->addSelect('e');
    $qb->leftJoin('d.equipements','e');
    $qb->where('e.id = :id')->setParameter('id', $id);

    return $qb->getQuery()->getArrayResult();
}

ID付きDomainのすべてを含むビルダーを作成するのを手伝ってもらえますか?Equipment$id

4

2 に答える 2

0

を使用する必要がありますExpr::in()

/**
 * @param int $id Equipment ID
 * @return array
 */
public function getDomainsRelatedToEquipment($id)
{
    $qb = $this->createQueryBuilder('d');
    $qb->where($qb->expr()->in('e.domains', array('?1'));

    $q = $qb->getQuery();
    $q->setParameter(1, $id);

    return $q->execute();
}

免責事項:私は自分のコードをテストしていません!

于 2012-08-23T16:15:14.870 に答える
0

試してみましたが、うまくいきません。テスト用のアクションを作成しました:

public function testAction() {
$em = $this->getDoctrine()->getEntityManager();
    $qb = $em->getRepository('myBundle:Equipement')->createQueryBuilder('e');
    $qb->where($qb->expr()->in('e.domaines', array('?1')));
    $q = $qb->getQuery();
    $q->setParameter(1, 1);

    var_dump($q->getArrayResult());

}

しかし、意味論的なエラーがあります

[Semantical Error] line 0, col 61 near 'domaines IN(': Error: Invalid PathExpression.     
StateFieldPathExpression or SingleValuedAssociationField expected. 

私のクラスの機器にはフィールドドメインがあります。

class Equipement
{
[...]

/**
 * @ORM\ManyToMany(targetEntity="Domaine", inversedBy="equipements")
 */
private $domaines;

このような配列を構築することで問題を回避しました:

    $domaines = array();
    $em = $this->getDoctrine()->getEntityManager();
    $equipement = $em->getRepository('iMDEODISAASBundle:Equipement')->find($equipementId);
    $repoDomaine = $em->getRepository('iMDEODISAASBundle:Domaine');
    $idx = 0;
    foreach ($equipement->getDomaines() as $domaine) {
        $d= $repoDomaine->get($domaine->getId());
        $domaines[$idx]=$d[0];
        $idx++;
    }
    return $domaines;

しかし、これはこれを行うための最良の方法ではないと思います。

于 2012-08-24T07:27:35.177 に答える