正如标题所述,我想运行一个查询来从一个表中获取它们各自关系的计数结果。
假设我有一个名为Person
的实体,它与一个Friend
实体具有OneToMany关系。
Person实体可能看起来像以下内容:
class Person
{
/**
* @ORM\OneToMany(...)
*/
protected $friends;
public function __construct()
{
$this->friends = new ArrayCollection();
}
...
}
我想要实现的一个经典 SQL 解决方案可能如下所示:
SELECT p.*, COUNT(f.id) as friendsCount
FROM Persons p
LEFT JOIN Friends f
ON f.person_id = p.id
GROUP BY p.id
现在我在想是否可以在DQL中完成这个任务,并将“count”值存储到“Person”实体中。假设我像下面这样扩展“Person”实体:(请记住,这只是一个想法)
class Person
{
/**
* @ORM\OneToMany(...)
*/
protected $friends;
protected $friendsCount;
public method __construct()
{
$this->friends = new ArrayCollection();
}
...
public function getFriendsCount()
{
return $this->friendsCount;
}
}
现在我遇到了困难,无法找到如何从DQL中填充实体中的计数值:
SELECT p, /* What comes here ? */
FROM AppBundle\Entity\Person p
LEFT JOIN p.friends f
GROUP BY p.id
PS: 我知道我可以直接这样做:
$person->getFriends()->count();
甚至可以将其标记为extra lazy以获取计数结果。
我认为这个“计数关系”的示例很好地展示了我想做的事情。
(即从dql填充实体的非@ORM\Column
属性)
Doctrine可以做到吗?
这会违反一些稳固原则吗?(SRP?)
谢谢您的留言;)