数组属性

时间:2016-12-28 21:24:57

标签: symfony doctrine-orm dql

实际上我有两个实体A和B,由多对多关系映射。 Doctrine用可以用DQL访问的A.bElements和B.aElements属性表示这种关系,所以我想在我的查询中使用这些属性,因为这个查询包含其他where子句,并且在同一查询中完成所有工作看起来细

我有一个返回一些B元素的子查询,我想检查A.bElements中是否存在至少一个这样的元素。问题是IN子句只适用于一个值,而不适用于数组。

以下是我的查询示例(适用于搜索引擎):

$qb->select('l')
   ->from('AppBundle:Livre', 'l')
   ->where("l.ISBN LIKE :motcle")
   ->orWhere("l.cote LIKE :motcle")
   ->orWhere($qb->expr()->in('l.dessinateurs',
       $em->createQueryBuilder()
          ->select('d.id')
          ->from('AppBundle:Artiste', 'd')
          ->where('d.dessinateur=1')
          ->andWhere('d.nom LIKE :motcle OR d.prenom LIKE :motcle')
          ->setParameter('motcle', '%'.$motcle.'%')
          ->getDql()
   ))
   ->setParameter('motcle', '%'.$motcle.'%');

在这里,我想要所有'Livre'实体,其中至少有一个子查询结果为l.dessinateurs属性。

我知道通过分别检索所有B和A元素来实现这项工作是可能的,然后使用php检查是否存在共同元素。也可以使用连接表,但我想Doctrine旨在避免直接使用这样的表。

也许有人可以帮助我?也许问题不够明确,如果有必要我可以尝试重新制定。提前谢谢。

修改

以下查询正常工作:

$qb->select('l')
    ->from('AppBundle:Livre', 'l')
    ->join('l.serie', 's')
    ->join('l.editeur', 'e')
    ->join('l.dessinateurs', 'd', 'WITH', 
        'd.nom LIKE :motcle 
        OR d.prenom LIKE :motcle 
        OR l.ISBN LIKE :motcle 
        OR l.cote LIKE :motcle 
        OR l.etat LIKE :motcle 
        OR l.edition LIKE :motcle
        OR s.libelle LIKE :motcle 
        OR e.nom LIKE :motcle')
    ->join('l.auteurs', 'a', 'WITH', 
        'a.nom LIKE :motcle 
        OR a.prenom LIKE :motcle 
        OR l.ISBN LIKE :motcle 
        OR l.cote LIKE :motcle 
        OR l.etat LIKE :motcle 
        OR l.edition LIKE :motcle
        OR s.libelle LIKE :motcle 
        OR e.nom LIKE :motcle')
    ->setParameter('motcle', '%'.$motcle.'%');

不幸的是,我必须在两个连接中重复其他LIKE子句,但这是另一个问题。 ccKep的答案是完美的。

1 个答案:

答案 0 :(得分:1)

你可以试一试:

$qb->select('l')
   ->from('AppBundle:Livre', 'l')
   ->join('l.dessinateurs', 'd', 'WITH', 'd.dessinateur=1 AND (d.nom LIKE :motcle OR d.prenom LIKE :motcle)')
   ->where("l.ISBN LIKE :motcle")
   ->orWhere("l.cote LIKE :motcle")
   ->setParameter('motcle', '%'.$motcle.'%');