如何使用QueryBuilder构建查询?

时间:2015-04-20 15:03:25

标签: php symfony orm doctrine-orm

我目前正在尝试使用Doctrine2 QueryBuilder构建查询。但是,我在尝试执行以下操作时遇到困难:

我有一个名为'客户'的实体。该实体与“用户”的ManyToMany-Relation有关。 “用户”再次代表与PhoneNumber的ManyToMany-Relation。

所以它几乎是:

Customer <- @ManyToMany -> User <- @ManyToMany -> PhoneNumber

现在我正在尝试根据PhoneNumber选择客户。所以现在我有以下内容:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb
    ->select('c')
    ->from('AppBundle:Customer', 'c')
    ->join('AppBundle:User', 'u')
    ->join('AppBundle:PhoneNumber', 'u');

现在的问题是我不知道如何构建查询的where-section。原因是可能有多个用户和多个电话号码绑定到客户。你对如何进行了解吗?

2 个答案:

答案 0 :(得分:0)

如果您的实体 mappedBy / InversedBy ,您可以

$qb = $this->getEntityManager()->createQueryBuilder();
$qb
    ->select('c')
    ->from('AppBundle:Customer', 'c')
    ->innerJoin('c.users', 'u')
    ->innerJoin('u.phoneNumbers', 'p')
    ->andWhere('p.number = :numberPhone')
    ->setParameter('numberPhone', $varPhoneNumber)
;

答案 1 :(得分:0)

我的解决方案:

使用内部Join()和'MEMBER OF'修复了问题。这样我就可以将每个实体与任何其他实体连接起来。 E.g:

$qb = $this->getEntitiyManager()->createQueryBuilder()
    ->select('c')
    ->from('AppBundle:Customer', 'c')
    ->innerJoin('AppBundle:User', 'u', 'WITH', 'c.id MEMBER OF c.users')
    ->innerJoin('AppBundle:PhoneNumber', 'ph', 'WITH', 'ph.id MEMBER OF u.phoneNumbers')
    ->orWhere($qb->expr()->orX(
            $qb->expr()->eq('ph.number', ':number')
    ))
    ->setParameter('number', $somePhoneNumber);