Lo'*_*Lo' 4 doctrine many-to-many query-builder symfony
在我的Symfony2项目中,我有两个实体"联系人"和"设置",有多对多关系:
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Settings", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
*/
private $settings;
Run Code Online (Sandbox Code Playgroud)
实体设置具有属性"parametre",这是一个简单的字符串.
现在我想得到所有没有"参数"是"主题"的设置的联系人.
我可以在SQL中使用以下查询执行此操作:
SELECT DISTINCT(c.id) FROM contact c WHERE c.id
NOT IN (SELECT cs.contact_id FROM contact_settings cs
INNER JOIN Settings s ON s.id = cs.settings_id
WHERE s.parametre = "THEMES")
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何使用Doctrine的查询构建器来完成它.这是我到目前为止所尝试的:
$query = $this->createQueryBuilder('c')
->join('c.settings', 's');
$qb2 = $qb;
$qb2->select('s2')
->from('AppBundle\Entity\Settings', 's')
->where('s2.parametre = :parametre');
$query->where(($qb->expr()->notIn('s', $qb2->getDQL())));
$query->setParameter('parametre', 'THEMES');
$result = $query->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)
这不会返回任何结果.
谢谢!
你可以尝试这样的事情:
$subQueryBuilder = $this->getEntityManager()->createQueryBuilder();
$subQuery = $subQueryBuilder
->select(['cs.id'])
->from('AcmeDemoBundle:Contact', 'cs')
->innerJoin('cs.settings', 's')
->where('s.parameter = :parameter')
->setParameter('parameter', 'THEMES')
->getQuery()
->getArrayResult()
;
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$query = $queryBuilder
->select(['c'])
->from('AcmeDemoBundle:Contact', 'c')
->where($queryBuilder->expr()->notIn('c.id', ':subQuery'))
->setParameter('subQuery', $subQuery)
->getQuery()
;
$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)
这只是您问题的一个示例.我不能提供完整的例子,因为我不知道你的实体的结构......
| 归档时间: |
|
| 查看次数: |
6789 次 |
| 最近记录: |