Doctrine2查询(Builder)在使用"其中"之后失去了关系。和" in"条款

时间:2015-06-19 22:17:51

标签: mysql orm doctrine-orm query-builder

我有两个实体,我们称之为" Girl"和"功能"。实体"女孩"与"特征"。

处于非定向的ManyToMany关系

我有一个简单搜索表单的页面。我想搜索Girls by Features。在服务器端提交表单之后我得到的是功能ID列表,我应该返回的是已选择功能列表的女孩列表包含所有其他功能,该女孩

让我们来看看: ╔════════════╦═══════════════╦═══════════════╦═══════════════╗ ║ ║ (1) Feature 1 ║ (2) Feature 2 ║ (3) Feature 3 ║ ╠════════════╬═══════════════╬═══════════════╬═══════════════╣ ║ (1) Girl 1 ║ Yes ║ Yes ║ No ║ ║ (2) Girl 2 ║ Yes ║ No ║ Yes ║ ╚════════════╩═══════════════╩═══════════════╩═══════════════╝

括号中的数字是实体ID。

我最初做的是:

$qbd = $this->getQbd('AppBundle:Girl', 'g')
        ->select('g, gf')
        ->leftJoin('g.features', 'gf');

从URL获取数据(特征ID)(因为使用GET方法)并将它们放入$ features数组后,我执行以下操作:

if (!empty($features)) {
    $qbd->where(
        $qbd->expr()->in('gf.id', ':features')
    )->setParameter('features', $features);
}

尽可能简单。

一切都很好。几乎。

当我尝试搜索功能ID等于2和3的女孩时,我得到了结果两个女孩(这是好的)。可悲的是,他们每个人只有2和3的特征(对于这种情况;当我试图为他们每个人执行$ girl-> getFeatures())时,即使他们两个也应该包含对特色1。

我做错了什么?我已经尝试为这种情况构建其他更复杂的查询,但最终我们遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

您可以使用" 会员" DQL构造。

例如你可以这样做:

$qb->from('AppBundle:Girl', 'g')
   ->select('g')
   ->andWhere(':feature MEMBER OF g.features')
   ->setParameter('feature', $feauture);

它只能用于单一功能。例如,如果你需要让女孩有特征A和B你需要这样做:

$qb->from('AppBundle:Girl', 'g')
   ->select('g')
   ->andWhere(':featureA MEMBER OF g.features')
   ->setParameter('featureA', $featureA)
   ->andWhere(':featureB MEMBER OF g.features')
   ->setParameter('featureB', $featureB);

这是我所知道的搜索集合中某个实体最干净的方法。但是,如果您需要搜索具有许多相关实体(功能)的某个实体(女孩),您将使用此方法遇到一些性能问题。在这种情况下,最好使用子查询。