仅联接满足特定条件的行(左联接数据的左联接)



我有与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

相关内容

  • 没有找到相关文章

最新更新