gpt4 book ai didi

php - DQL 多对多和计数

转载 作者:可可西里 更新时间:2023-11-01 12:52:33 24 4
gpt4 key购买 nike

我将 Symfony 2 与 Doctrine 一起使用,并且我有两个实体加入了多对多关联。假设我有两个实体:User 和 Group,db 上的相关表是 users、groups 和 users_groups。

我想在 DQL 中获取前 10 个人口最多的组,但我不知道在连接表 (users_groups) 上执行查询的语法。我已经看过 Doctrine 手册,但我没有找到解决方案,我想我还有很多关于 DQL 的知识。

在普通的 sql 中将是:

select distinct group_id, count(*) as cnt from users_groups group by group_id order by cnt desc limit 10

你能帮我把它翻译成 DQL 吗?

更新(类):

/**
* Entity\E_User
*
* @ORM\Table(name="users")
* @ORM\Entity
*/
class E_User
{
/**
* @ORM\ManyToMany(targetEntity="E_Group", cascade={"persist"})
* @ORM\JoinTable(name="users_groups",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="cascade")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id", onDelete="cascade")}
* )
*/

protected $groups;

/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;

/* ... other attributes & getters and setters ...*/
}


/**
* Entity\E_Group
*
* @ORM\Table(name="groups")
* @ORM\Entity
*/
class E_Group
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $name
*
* @ORM\Column(name="text", type="string", length=255)
*/
private $name;

/* ... other attributes & getters and setters ...*/
}

最佳答案

没有看到实际的类并不容易,但是通过猜测你有一个多对多的双向关系:

$dql = "SELECT g.id, count(u.id) as cnt FROM Entity\Group g " .
"JOIN g.users u GROUP BY g.id ORDER BY cnt DESC LIMIT 10;";
$query = $em->createQuery($dql);
$popularGroups = $query->getArrayResult();

更新:

你不必使用双向关系,你可以反过来查询:

$dql = "SELECT g.id, count(u.id) as cnt FROM Entity\User u " .
"JOIN u.groups g GROUP BY g.id ORDER BY cnt DESC LIMIT 10;";

关于php - DQL 多对多和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175736/

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