我有与FacebookPage和应用程序实体关联的用户。FacebookPage实体也有与之关联的应用程序实体。
$qb = $this->createQueryBuilder('u')
->addSelect('p', 'a')
->leftJoin('u.facebook_pages', 'p')
->leftJoin('p.applications', 'a')
->leftJoin('a.editors', 'e', 'WITH', 'e = :user')
->where('u = :user')
->setParameter('user', $user)
->orderBy('p.name', $order)
;
$u = $qb->getQuery()->getSingleResult();
return $u->getFacebookPages();
我想返回用户的所有 Facebook 页面,然后显示与该页面关联的应用程序计数。我只想计算用户是编辑器的应用程序。
运行当前查询时,页面具有所有页面应用程序的计数(因此计数包括用户不是编辑者的应用程序)。
如果我将a.editors
leftJoin
更改为join
,我会得到页面的正确计数,但它只列出了实际具有任何应用程序的页面。
如何显示所有页面并仅加入用户是编辑者的应用程序?
我通过添加一个新查询来获取用户是编辑器的应用程序的应用程序 ID,从而解决了这个问题。
$user_apps = $this->getEntityManager()->getRepository('Application')->getUserApps($user);
$app_ids = array();
foreach($user_apps as $app) {
$app_ids[] = $app->getId();
}
$qb = $this->createQueryBuilder('u')
->addSelect('p', 'a')
->leftJoin('u.facebook_pages', 'p');
if(count($app_ids)) {
// join with IN statement to include only apps where user is an editor
$qb->leftJoin('p.applications', 'a', 'WITH', sprintf('a.id IN (%s)', implode(',', $app_ids)));
} else {
// join empty anyway to avoid db calls when iterating over pages
$qb->leftJoin('p.applications', 'a');
}
$qb
->where('u = :user')
->setParameter('user', $user)
->orderBy('p.name', $order)
;
try {
$u = $qb->getQuery()->getSingleResult();
} catch (Exception $e) {
throw $e;
}
return $u->getFacebookPages();
现在,这将返回所有用户的Facebook页面,并且仅加入用户是编辑者的应用程序。我可能会将其更改为 DQL 查询,以便我可以将 id 移动到子查询IN
。