我做错了什么:
public function findAllVendorsByCategory ($categoryId)
{
$em = $this->getEntityManager();
$vendors = $em->createQueryBuilder('v')
->distinct()
->innerJoin('v.category', 'c')
->where('c.id = :category_id')
->setParameter('category_id', $categoryId)
->getQuery()
->iterate()
;
return $vendors;
}
我特别提到的错误是:
在调用getRootAlias()之前未设置别名。
我尝试添加select()并且没有任何工作 - 这个代码在控制器的上下文中创建时工作正常 - 但是当我将它移动到它自己的repo-poof中时!?!
思想?
编辑|最新尝试
$vendors = $em->createQueryBuilder()
->distinct()
->from('Vendor', 'v')
->innerJoin('category', 'c', JOIN::ON, 'v.category_id = c.id')
->where('c.id = :category_id')
->setParameter('category_id', $categoryId)
->getQuery()
->iterate()
;
这会产生DQL,如:
SELECT DISTINCT FROM Vendor v INNER JOIN category c ON v.category_id = c.id WHERE c.id = :category_id
但是当我在bin / console或app中评估DQL时,我得到:
[语法错误]第0行,第16行:错误:预期的IdentificationVariable | ScalarExpression | AggregateExpression |功能声明| PartialObjectExpression | “(”Subselect“)”| CaseExpression,得到了 'FROM'
答案 0 :(得分:3)
如果从createQueryBuilder
继承,您应该使用存储库中的Doctrine\ORM\EntityRepository
方法:
Doctrine EntityRepository类的Alias方法:
/**
* Creates a new QueryBuilder instance that is prepopulated for this entity name.
*
* @param string $alias
* @param string $indexBy The index for the from.
*
* @return QueryBuilder
*/
public function createQueryBuilder($alias, $indexBy = null)
{
return $this->_em->createQueryBuilder()
->select($alias)
->from($this->_entityName, $alias, $indexBy);
}
所以:
$vendors = $this->createQueryBuilder('v')
->distinct()
->innerJoin('v.category', 'c')
->where('c.id = :category_id')
->setParameter('category_id', $categoryId)
->getQuery()
->iterate()
;
或者,您可以继续使用EntityManager中的createQueryBuilder
方法,但是您需要添加至少->from
调用(就像别名方法一样)。