我有一个名为Shops的桌子,我想把这个Shop条目划分为5.我的桌子上有80k条目,我希望用户A可以访问16k的第一家商店,用户B可以访问下一个16k商店等等等我知道我可以使用限制,但Shop的主键/ ID不是顺序的。
目前我的查询如下:
if (in_array("ADMIN1", $userRoles)) {
$lowerLimit = 0;
$upperLimit = $numberOfProspectiveShops/5;
} else if (in_array("ADMIN2", $userRoles)) {
$lowerLimit = $numberOfProspectiveShops/5;
$upperLimit = ($numberOfProspectiveShops/5) * 2;
} else if (in_array("ADMIN3", $userRoles)) {
$lowerLimit = ($numberOfProspectiveShops/5) * 2;
$upperLimit = ($numberOfProspectiveShops/5) * 3;
} else if (in_array("ADMIN4", $userRoles)) {
$lowerLimit = ($numberOfProspectiveShops/5) * 3;
$upperLimit = ($numberOfProspectiveShops/5) * 4;
} else if (in_array("ADMIN5", $userRoles)) {
$lowerLimit = ($numberOfProspectiveShops/5) * 4;
$upperLimit = $numberOfProspectiveShops;
}
$prospectiveShopsQuery = $em->createQueryBuilder()->select('s')
->from("AppMainBundle:ProspectiveShop", 's')
->andWhere('s.id <= :upperLimit')
->setParameter('upperLimit', $upperLimit)
->andWhere('s.id > :lowerLimit')
->setParameter('lowerLimit', $lowerLimit)
->andWhere('s.status IS NULL')
;
答案 0 :(得分:1)
您应该使用mySQL的“限制”功能,而不是基于id的where子句。
这可以通过使用setFirstResult($ offset)和setMaxResults($ limit)来实现。 对于前5000,偏移应该等于0并且限制为5000,然后接下来的5000偏移= 5000和限制5000
您的查询构建器应如下所示:
$prospectiveShopsQuery = $em->createQueryBuilder()->select('s')
->from("AppMainBundle:ProspectiveShop", 's')
->andWhere('s.status IS NULL')
->setFirstResult($offset)
->setMaxResults($limit)
;