获取树枝(或控制器)中每个记录的相关实体编号


Get related entity number for each record in twig (or controller)

我有一个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;
.....

这是我的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 %}

问题是我似乎不知道如何计算和传递每组的人数。通过调用原则并获取存储库并将组对象传递给视图,所有其他数据都很容易,但是如何为我的记录传递其他数据呢?

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 %}

在您的实体之间创建一个一对多,双向关联,然后在twig中您可以访问每个组的人员

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();
    }

}

在twig中,您可以使用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();

在twig中,您可以使用total_peoples index循环查看结果并显示计数

注意,这不会返回没有任何关联用户的组表示计数为0的组将不会返回,因为它是内部的加入,你需要的是正确的加入到组实体不幸的是它不是可能在dql中有一个正确的连接原则dql正确的连接?

为了实现正确的连接并坚持原则关联,您必须实现一对多,双向