gpt4 book ai didi

symfony - 实体中的Symfony/原则关系COUNT

转载 作者:行者123 更新时间:2023-12-04 18:35:49 25 4
gpt4 key购买 nike

如标题所述,

我想运行1个查询,以从具有各自关系计数的表中获取结果。

可以说我有一个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中完成并将计数值存储到 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();

甚至将其标记为额外的懒惰以获得计数结果。

尽管这个计数关系示例很好地说明了我正在尝试做的事情。

(从dql填充实体的non @ORM\Column属性)

教义有可能吗?

这是否违反了一些可靠的原则? (SRP吗?)

您的爱人的Cookie;)

最佳答案

您可能只想根据需要选择计数,如上面$person->getFriends()->count();所述。但是,您可以同时选择一个对象和一个计数-参见这些Doctrine DQL example,有一个与您正在做的非常相似的事情:

SELECT p, COUNT(p.friends)
FROM AppBundle\Entity\Person p
LEFT JOIN p.friends f
GROUP BY p.id

应该返回的是一个包含对象和计数的数组数组,如下所示:
[
[Person, int],
[Person, int],
...,
]

最好的选择是在 PersonRepository上进行存储库调用,类似于 findPersonsWithFriendCount(),它看起来像:
public function findPersonsWithFriendCount()
{
$persons = array();

$query = $this->_em->createQuery('
SELECT p, COUNT(p.friends)
FROM AppBundle\Entity\Person p
LEFT JOIN p.friends f
GROUP BY p.id
');

$results = $query->getResult();

foreach ($results as $result) {
$person = $result[0];
$person->setFriendsCount($result[1]);

$persons[] = $person;
}

return $persons;
}

请记住,您需要在 setFriendsCount()对象上添加 Person函数。您还可以编写一个 native SQL查询,并使用 result set mapping自动将原始结果的列映射到您的实体字段。

关于symfony - 实体中的Symfony/原则关系COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com