Php Doctrine2多重联接可用于createQuery,但不能用于queryBuilder
如果我使用不带queryBuilder的查询与此dqlPhp Doctrine2多重联接可用于createQuery,但不能用于queryBuilder,php,symfony,doctrine-orm,dql,Php,Symfony,Doctrine Orm,Dql,如果我使用不带queryBuilder的查询与此dql $query = $this->_em ->createQuery("SELECT p, g, c FROM LikeYeah\GoBundle\Entity\Product p JOIN p.garments g LEFT JOIN g.colours c ORDER BY p.id DESC "); 一切
$query = $this->_em
->createQuery("SELECT p, g, c
FROM LikeYeah\GoBundle\Entity\Product p
JOIN p.garments g
LEFT JOIN g.colours c
ORDER BY p.id DESC
");
一切都很好,但是如果我像这样使用(我相信是一样的)查询生成器
$qb->select('p, g, c')
->from('LikeYeah\GoBundle\Entity\Product', 'p')
->join('p.garments', 'g')
->leftJoin('g.colours', 'c')
->orderBy('p.id', 'desc');
我得到以下错误:
“语义错误]第0行,第66列。颜色c,LikeYeah\GoBundle\Entity\Product”:错误:在连接路径表达式中使用了标识变量g,但之前未定义。“
我错过了什么?可以试试
$qb->select('p, g, c')
->from('GoBundle:Product', 'p')
->join('p.garments', 'g')
->leftJoin('g.colours', 'c')
->orderBy('p.id', 'desc');
显示$qb init和DQL结果您可以从该方法获得帮助
public function findSampleClothingTypeGender($gender) {
$query = $this->getEntityManager()
->createQuery('
SELECT p FROM Acme:Product p
JOIN p.clothing_type ct
WHERE p.gender = :gender'
)->setParameter('gender', $gender);
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
它对我有用
$this->_em->createQueryBuilder()
->select('fu,e,t')
->from('\xxxx\AdminBundle\Entity\FrontUser','fu')
->join('fu.read_essays','e')
->leftJoin('e.tags','t')
->getQuery()->execute();
我认为您应该创建一个新的QueryBuilder对象
您可以使用以下代码查看该QueryBuilder的Dql
$qb->getDQL() 尝试以下操作:在加入后使用addSelect:
$qb->select('p')
->join('p.garments', 'g')
->addSelect('g')
->from('LikeYeah\GoBundle\Entity\Product', 'p')
->join('p.garments', 'g')
->leftJoin('g.colours', 'c')
->addSelect('c')
->orderBy('p.id', 'desc');
试试下面的一个
$qb->select('p','g','c')
->from(array('LikeYeah\GoBundle\Entity\Product','p'))
->join(array('p.garments','g'))
->join(array('g.colours','c'),'LEFT')
->order_by('p.id','DESC');
我在文档中看不到“join”,只有“leftJoin”和“innerJoin”。可能问题在于,您的“join”实际上是一个leftJoin,对于某些行,它没有定义“g”,因为没有任何东西可以连接……Wojciech,不是这样,QueryBuilder有一个名为
join()
的方法,它基本上是innerJoin()
的别名。