2013-03-21 109 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') 
; 

不能使用左連接,你會匹配沒有你的蛞蝓項目。