代码之家  ›  专栏  ›  技术社区  ›  crmpicco

在Symfony 3.4中展开Doctrine QueryBuilder连接查询中的数组结构

  •  0
  • crmpicco  · 技术社区  · 5 年前

    我的 PersonRepository 在我的Symfony 3应用程序中。它加入了 Person 实体与 Log 我可以在其中获取 .

    public function findAllPlayers()
    {
        $qb = $this->getEntityManager()->createQueryBuilder('p');
    
        $qb
            ->select('p AS playerInfo', 'al.time AS createdTime')
            ->from('AppBundle:Player', 'p')
            ->join('AppBundle:Log', 'al', Expr\Join::WITH, $qb->expr()->eq('al.player', 'p.id'))
            ->where(
                $qb->expr()->andX(
                    $qb->expr()->eq('p.type', ':type'),
                    $qb->expr()->eq('al.type', ':al_type')
                )
            )
            ->setParameter('type', 'midfielder')
            ->setParameter('al_type', 'log.player.created');
    
        return $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);
    }
    

    当我把这个输入到我的小树枝模板时,我就只剩下这个笨拙的 index 如果可能的话,我想取消。

    {% for index, player in players %}
         <tr>
             <td>{{ player.playerInfo.playerShortname }}</td>                     
         </tr>
    {% endfor %}
    

    有没有一种方法可以让我“扁平化”,因为想要一个更好的词,结构去除多余的 指数 从返回的结构。很好,但是有点乱 指数 不需要或不在任何地方使用。

    0 回复  |  直到 5 年前
        1
  •  0
  •   alexsakhnov    5 年前

    你的小枝模板不使用 index 变量,以便您可以随意删除它:

    {% for player in players %}
         <tr>
             <td>{{ player.playerInfo.playerShortname }}</td>                     
         </tr>
    {% endfor %}
    
        2
  •  0
  •   Vignesh Sakthivel    5 年前

    如果您正在寻找呈现多个用户的解决方案:-

    您可以使用以下代码段。在for循环中使用索引不是强制的。您可以参考中提供的第一个示例 https://twig.symfony.com/doc/2.x/tags/for.html

    {% for player in players %}
         <tr>
             <td>{{ player.playerInfo.playerShortname }}</td>                     
         </tr>
    {% endfor %}
    

    如果您正在寻找只呈现一个结果的解决方案:-

    有一个方法——“getOneOrNullResult”。但是,如果行数大于一,则抛出异常。因此,在DQL中应用limit=1,并使用方法“getOneOrNullResult”而不是“getResult”

    要限制限制的数量,可以使用方法-“setMaxResults()”

    你的方法如下

    public function findAllPlayers()
    {
        $qb = $this->getEntityManager()->createQueryBuilder('p');
    
        $qb
            ->select('p AS playerInfo', 'al.time AS createdTime')
            ->from('AppBundle:Player', 'p')
            ->join('AppBundle:Log', 'al', Expr\Join::WITH, $qb->expr()->eq('al.player', 'p.id'))
            ->where(
                $qb->expr()->andX(
                    $qb->expr()->eq('p.type', ':type'),
                    $qb->expr()->eq('al.type', ':al_type')
                )
            )
            ->setParameter('type', 'midfielder')
            ->setParameter('al_type', 'log.player.created');
    
        return $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(Query::HYDRATE_ARRAY);
    }
    

    注:- 但是,我不认为加入日志以获得创建的时间是一个理想的解决方案,因为随着日志表的增长,这可能会导致严重的性能问题。如果有业务需要,最好将创建的时间存储在表中。