DQL里面的自定义仓库

时间:2017-10-06 18:53:01

标签: symfony doctrine-orm

我做错了什么:

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'

1 个答案:

答案 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调用(就像别名方法一样)。