有一个实体用户:用户名、角色(json)等。
有一个实体预约:patient_id、doctor_id 等。
我需要进行这样的查询以返回所有唯一用户,其中医生 ID = 所需的用户。由于角色字段,DISTINCT 在这种情况下不合适。如何提出请求?
我以我的情况为例:Appointment 中有 3 条记录具有相同的医生 ID 和患者 ID。当通过inner join Appointment 进行用户选择时,请求后返回3次患者,打破了分页和总数的输出。
$pageQb = $this->createQueryBuilder('u');
$pageQb->select('count(u.id)');
$qb = $this->createQueryBuilder('u');
$qb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$pageQb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$qb->setFirstResult(($page - 1) * $pageSize);
$qb->setMaxResults($pageSize);
try {
$totalEntities = (int) $pageQb->getQuery()->getSingleScalarResult();
$totalPages = ceil($totalEntities / $pageSize);
} catch (NoResultException $e) {
$totalEntities = 0;
$totalPages = 0;
} catch (NonUniqueResultException $e) {
$totalEntities = 0;
$totalPages = 0;
}
return [$totalEntities, $totalPages, $qb->getQuery()->getResult()];
pageQb->getQuery()->getSingleScalarResult() 会返回 3,$qb->getQuery()->getResult() 会返回一个唯一记录,但是如果你在数据库中重复这个查询,那么也会有 3 个记录. 这也会影响分页。
医生和病人是Entity User,ManyToOne关系。
UPD:总计,我现在选择了以下选项:
$qb = $this->createQueryBuilder('u');
$qb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$qb->setFirstResult(($page - 1) * $pageSize);
$qb->setMaxResults($pageSize);
$paginator = new Paginator($qb, false);
$totalEntities = $paginator->count();
$totalPages = (int) ceil($totalEntities / $pageSize);
$users = [];
foreach ($paginator as $user) {
$users[] = $user;
}
return [$totalEntities, $totalPages, $users];
当学说从基中获取结果并创建实体对象时,它不会将每个找到的行映射到单独的实体,它更聪明一点。她知道,通过连接,某些列将被复制,并且她将正确处理所有行,而不会创建不必要的实体。因此,您的请求是正确的。
但是在join的情况下分页也不是那么简单。您将在结果行中有重复的列(在任何 mysql 客户端中进行不计数的查询,并使用连接查看查询结果)。这样您就不必每次都为分页而烦恼(尽管我建议您至少做一次,只是为了了解它的工作原理),该学说包含用于分页的特殊工具。您创建一个分页器对象并可以调用 count($paginator) 来获取总页数。不要忘记使用 setFirstResult 和 setMaxResults 使其工作。