如何在 symfony 存储库中使用 group by

Posted

技术标签:

【中文标题】如何在 symfony 存储库中使用 group by【英文标题】:How to use group by in symfony repository 【发布时间】:2017-12-21 12:02:48 【问题描述】:

我在DayRepository.php 中有此代码:

public function findAllFromThisUser($user)
    
        $query = $this->getEntityManager()
            ->createQuery(
                'SELECT d FROM AppBundle:Day d
                WHERE d.user = :user
                ORDER BY d.dayOfWeek ASC'
            )->setParameter('user', $user);
        try
            return $query->getResult();
         catch (\Doctrine\ORM\NoResultException $e)
            return null;
        

    

在控制器DayController.php,我有这个代码:

/**
 * @Route("/days/list", name="days_list_all")
 */
public function listAllAction()

    $user = $this->container->get('security.token_storage')->getToken()->getUser();

    $days = $this->getDoctrine()
        ->getRepository('AppBundle:Day')
        ->findAllFromThisUser($user);

    //$user = $job->getUser();

    return $this->render('day/listAll.html.twig', ['days' => $days]);

dump(days) day/listAll.html.twig 中的输出是:

array:3 [▼
  0 => Day #699 ▼
    -id: 11
    -dayOfWeek: "0"
    -lessonTime: DateTime #716 ▶
    -user: User #486 ▶
    -job: Job #640 ▶
    -client: Client #659 ▶
  
  1 => Day #657 ▼
    -id: 13
    -dayOfWeek: "0"
    -lessonTime: DateTime #658 ▶
    -user: User #486 ▶
    -job: Job #640 ▶ …2
    -client: Client #659 ▶ …2
  
  2 => Day #655 ▼
    -id: 12
    -dayOfWeek: "4"
    -lessonTime: DateTime #656 ▶
    -user: User #486 ▶
    -job: Job #640 ▶ …2
    -client: Client #659 ▶ …2
  
]

我真正需要的是对结果进行分组,以便将具有dayOfWeek0 的所有结果组合在一起?我需要根据dayOfWeek 属性对结果进行分组。我曾尝试在查询中使用GROUP BY d.dayOfWeek,但出现此错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'taskMaestro.d0_.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

感谢您的宝贵时间。

【问题讨论】:

这是在 mysql 5.7 中,使用聚合函数。关于这个的几个问题,这里是一个示例问题,***.com/questions/34115174/… 谢谢@Sameera。我已经研究了该链接的问题和答案大约三个小时,而没有将逻辑应用于我自己的问题。你能告诉我如何在这种情况下应用逻辑吗?谢谢 结果有没有共同的价值? 你真正需要从这个查询中得到什么值? 是的。对于几个结果,dayOfWeek 可能相似。我想将周日的工作组合在一起,将周一的工作组合在一起等。 【参考方案1】:

我会尽力提供解决方案和解释,这可能会对您有所帮助。 假设您有这样的表结构:

并且您想要获取按dayOfWeek 分组的所有记录以及将在这一天进行讲座的讲师列表(分别以逗号分隔)。 你可能会想出这样的东西:

SELECT `dayOfWeek`, GROUP_CONCAT(`lector`) AS `dayLectors` FROM `day` GROUP BY `dayOfWeek`

结果将是:

另外,如果你想获取获取记录的 id 列表,你可以这样写:

SELECT `dayOfWeek`, GROUP_CONCAT(`lector`) AS `dayLectors`, GROUP_CONCAT(`id`) AS `dayIds` FROM `day` GROUP BY `dayOfWeek`

所以结果将是:

并且,如果我对您的问题的理解正确,那么这个答案可能会对您有所帮助。

【讨论】:

以上是关于如何在 symfony 存储库中使用 group by的主要内容,如果未能解决你的问题,请参考以下文章

存储库中的 Symfony DQL 查询

如何在 Symfony 3 中正确存储日期时间?

symfony2:如何在 QueryBuilder 中使用 group_concat

用于测试的 Symfony 模拟存储库

如何在 Symfony 2 中进入维护模式以安全地更新生产应用程序?

在 Symfony 中使用分页类的正确方法