2013-03-21 114 views
1

我在Symfony2的关系(多对多):添加查询生成器的详细条件,多对多

项目< - >类别

数据库:

项目: ID名称

类别 ID名称弹头

项目分类: ID ITEM_IDç ategory_id

我试图找到所有与该类别通过X蛞蝓连接的项目。

代码不起作用:

$qb = $this->createQueryBuilder('i') 
     ->select('i, c ') 
     ->leftJoin('i.categories', 'c') 

     ->setParameter('firstSlug', 'first') 
     ->andWhere('c.slug = :firstSlug') 

     ->setParameter('secondSlug', 'second') 
     ->andWhere('c.slug = :secondSlug') 

任何想法怎么办呢?

+0

我想'setParameter'需要拿出了'andWhere'条款 – 2013-03-21 19:33:44

+0

这个代码后: $ QB = $这个 - > createQueryBuilder( 'I') - >选择( 'I,C') - > leftJoin( 'i.categories', 'C') - >的setParameter( 'firstSlug', '第一') - > andWhere( 'c.slug =:firstSlug') 检索项ID:1 – 2013-03-21 19:45:13

+0

这个代码: - >的setParameter( 'secondSlug', '第二') - > andWhere( 'c.slug =:secondSlug') retrive项ID:1 但我需要拉出这里和这里的物品(按类别中断) – 2013-03-21 19:45:50

回答

0
$qb = $this->createQueryBuilder('i'); 
$qb 
    ->select('i') 
    ->join('i.categories', 'c') 
    ->where($qb->expr()->in('c.slug', ':slugs')) 
    ->setParameter('slugs', ['first_slug', 'second_slug', 'third_slug']) 
    ->distinct(i.id) // to prevent having same item more than once 
; 
+0

这是相同的 - >的setParameter( 'firstSlug', '第一') - > andWhere( 'c.slug =:firstSlug') - >的setParameter( 'secondSlug', '第二') - > orWhere ('c.slug =:secondSlug')我需要在两个类别中都带有给定列表的slugs – 2013-03-21 20:38:33

+0

的返回项目,最好不选中答案,否则无人会回应。 – Lighthart 2013-03-21 21:04:41

0

你有一张双人床和,没有你的类别有两种子弹,所以没有类别都c.slug =第一匹配和c.slug =第二。尝试:

$qb = $this->createQueryBuilder('i') 
    ->select('i, c ') 
    ->leftJoin('i.categories', 'c') 

    ->setParameter('firstSlug', 'first') 
    ->andWhere('c.slug = :firstSlug') 

    ->setParameter('secondSlug', 'second') 
    ->orWhere('c.slug = :secondSlug')    <<< change in this line 
+0

我需要返回两个类别中带有给定列表的子弹的项目,而不是OR。 – 2013-03-21 20:38:55

0

根据意见,我想你想使用连接条件:

$qb = $this->createQueryBuilder('i'); 
$qb->select('i, c ') 
    ->join('i.categories', 'c', 'ON', 'c.slug = :firstSlug') 
    ->join('i.categories', 'c', 'ON', 'c.slug = :secondSlug') 
    ->setParameter('firstSlug', 'first') 
    ->andWhere('c.slug = :secondSlug') 
; 

不能使用左连接,你会匹配没有你的蛞蝓项目。