我有一个People类和一个Group类。我知道每个人通过其“团体”领域属于哪个群体,但我不知道群体中的人是什么。为此,我必须通过查询People表来查找组中的所有人。
以下是我班级的相关部分:
class People
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id",type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Bundle\Entity\Groups")
* @ORM\JoinColumn(referencedColumnName="id")
*/
protected $group;
.....
这是我的小组课程的一部分。
class Group
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
...
我想要做的是计算每组中有多少人并将其传递给像这样的树枝模板:
{% for group in allGroups %}
<li>name: {{group.name}} </li>
<li>date:{{ group.createdAt|date('d-m-Y H:i:s') }}</li>
<li>Number of people: {{ group.peopleNo}}</li>
<hr>
{% endfor %}
问题在于我似乎无法找出如何计算和传递每组中的人数。通过调用doctrine并获取存储库并将组对象传递给视图,但是如何为记录传递其他数据,所有其他数据都很容易?
group.peopleNo
不是我的Group类的属性。我获得它的唯一方法是通过People类,并计算每个组中有多少人。但是如何将它通过控制器传递给视图?
使用下面的答案,我得到了这个结构:
array(2) {
[0]=>
array(2) {
[0]=>
string(8) "Array(4)"
["total_peoples"]=>
string(1) "3"
}
[1]=>
array(2) {
[0]=>
string(8) "Array(4)"
["total_peoples"]=>
string(1) "1"
}
}
我不知道如何在树枝中循环显示每个组的编号,因为它的编号顺序从0开始,而不是由我的组ID编制索引。我认为如果一个团队没有人就没关系,那么如果它找不到记录,我会说它有0个人。信息是正确的,我有两个组,一个有1个,另一个有3个人,但他们的id是1和2,而不是0和1。
这是我的树枝的样子,foreach中的foreach似乎是不好的做法:
{% for group in groups %}
<li> {{ group .name|e }}</li>
<li>{{ group .createdAt|date('d-m-Y H:i:s') }}</li>
<li>
{% for key, ppno in peopleno %}
{% if ppno [key] is defined %}
{% if ppno [key]['id']==ticket.id %}
people: {{ peopleno [key]['total_peoples'] }}
{% endif %}
{% else %}
people:0
{% endif %}
{% endfor %}
</li>
<hr>
{% endfor %}
答案 0 :(得分:1)
在您的实体之间创建One-To-Many, Bidirectional关联,然后在树枝中,您可以访问每个群组的人员
use Doctrine\Common\Collections\ArrayCollection;
class Group
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
...
/**
* @ORM\OneToMany(targetEntity="People", mappedBy="group")
**/
private $peoples;
// ...
public function __construct() {
$this->peoples = new ArrayCollection();
}
}
在树枝上,您可以使用length函数来获取每个群体的人数
{% for group in allGroups %}
<li>name: {{group.name}} </li>
<li>date:{{ group.createdAt|date('d-m-Y H:i:s') }}</li>
<li>Number of people: {{ group.peoples|length }}</li>
<hr>
{% endfor %}
如果您不想更新实体,可以编写连接查询
$DM = $this->getDoctrine()->getManager();
$peopleRepo = $DM->getRepository('People entity');
$qb = $peopleRepo->createQueryBuilder('p')
->select('g.name,g.createdAt,COUNT(p.id) AS total_peoples')
->innerJoin('p.group', 'g')
->groupBy('g.id')
->getQuery()
->getArrayResult();
在树枝中,您可以使用total_peoples
索引
请注意,这不会返回没有任何关联用户的组 意味着不会返回0计数的组,因为它是一个内部 加入,你需要的是加入团体实体,不幸的是它不是 可以在dql Doctrine DQL RIGHT JOIN?
中进行正确的连接
要实现正确的联接并坚持学说关联,您必须实施One-To-Many, Bidirectional