我很难创建一个查询来从两个表中获取信息。我想计算行数并按类别和类型对其进行分组。
我正常的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
任何帮助都将不胜感激。
答案 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');
或者,如果您仍然不想拥有映射并使用其他方法,则必须在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')