使用Doctrine Query Builder

时间:2017-10-13 14:12:52

标签: php postgresql symfony doctrine-orm

我很难创建一个查询来从两个表中获取信息。我想计算行数并按类别和类型对其进行分组。

我正常的PostgresSQL查询如下所示:

SELECT c.name AS category_name, i.type, count(i) AS number_of_items
FROM item i
INNER JOIN category c
ON i.category_id = c.id
GROUP BY c.name, i.type

如何使用Doctrine Query Builder构建此查询?

我尝试过:

$qb->select(['c.name', 'i.type', 'count(i)'])
    ->from('AppBundle:Item', 'i')
    ->innerJoin('i', 'AppBundle:Category', 'c', 'i.category_id = c.id')
    ->groupBy('c.name')
    ->groupBy('i.type');

return $qb->getQuery()->getResult();

但是这给了我一个错误:

  

[语义错误]第0行,第80行附近'i AppBundle:Category':   错误:未定义类'i'。

我正在尝试遵循此处的文档中的原则:http://doctrine-orm.readthedocs.io/projects/doctrine-dbal/en/latest/reference/query-builder.html#join-clauses

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用原则而不定义相关实体之间的任何映射不是一个好习惯,您应该从Association Mapping开始

一旦在实体中定义了映射,就可以使用包含链接实体引用的属性简单地加入主实体,doctrine将自动检测您不需要在查询生成器中指定的连接条件,示例映射为您的实体可以定义为

class Item
{

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="items")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;
}

-

use Doctrine\Common\Collections\ArrayCollection;
class Category
{
    /**
     * @ORM\OneToMany(targetEntity="Item", mappedBy="category")
     */
    private $items;

    public function __construct()
    {
        $this->items = new ArrayCollection();
    }
}

然后您的查询构建器将显示为

$qb->select('c.name', 'i.type', 'count(i)'])
    ->from('AppBundle:Category', 'c')
    ->innerJoin('c.items','i')
    ->groupBy('c.name')
    ->addGroupBy('i.type');

Relationship Mapping Metadata

或者,如果您仍然不想拥有映射并使用其他方法,则必须在doctrine中使用WITH子句

$qb->select(['c.name', 'i.type', 'count(i)'])
    ->from('AppBundle:Item', 'i')
    ->innerJoin('AppBundle:Category', 'c', 'WITH' , 'i.category_id = c.id')
    ->groupBy('c.name')
    ->addGroupBy('i.type');

答案 1 :(得分:0)

你不需要在select内使用数组试试这个:

$qb->select('c.name', 'i.type', 'count(i)')
    ->from('AppBundle:Item', 'i')
    ->innerJoin('i', 'AppBundle:Category', 'c', 'i.category_id = c.id')
    ->groupBy('c.name')
    ->groupBy('i.type');

return $qb->getQuery()->getResult();

答案 2 :(得分:0)

尝试为您的实体使用完整表达式,例如:

 ->from('AppBundle\Entity\Item','i')