2016-12-05 72 views
0

我想根據連接中的多個ID進行選擇,每個ID都應該匹配另一個連接的另一個條件。根據多個條件從連接中選擇主義

我需要獲得「位置」1或2中包含所有「Dichotomies」的「類型」。目前,它給我的結果與傳遞給函數的二分法之一相匹配,但不是全部。

$QB->select("Types","Types,ElementsPositions, Elements, Positions, Dichotomies, Quadras,TypesDescriptions,Relations") 
       ->from($this->get_repository()[0], 'Types'); 
       $QB->leftJoin("Types.ElementsPositions","ElementsPositions", \Doctrine\ORM\Query\Expr\Join::WITH, 'ElementsPositions.Positions = 1 OR ElementsPositions.Positions = 2'); 
       $QB->leftJoin("ElementsPositions.Elements","Elements"); 
       $QB->leftJoin("ElementsPositions.Positions","Positions"); 
       $QB->leftJoin("Elements.Dichotomies","Dichotomies"); 
       $QB->leftJoin("Types.Quadras","Quadras"); 
       $QB->leftJoin("Types.TypesDescriptions","TypesDescriptions"); 
       $QB->leftJoin("Types.Relations","Relations"); 

    if(!empty($where['dichotomies'])){ 
     foreach($where['dichotomies'] as $dichotomy){ 
       $QB->andWhere('Dichotomies.id'.'=:dichotomy'); 
       $QB->setParameter('dichotomy', $dichotomy['id']);     
     }    
    } 

UPD。 表映射 - 在JSON:

{ 
"table-name": "types",  
"joins":[ 
    { 
     "table-name":"elements_positions", 
     "type":"one-to-many" 
    }, 
    { 
     "table-name":"quadras", 
     "type":"many-to-one" 
    }, 
    { 
     "table-name":"types_descriptions", 
     "type":"one-to-one" 
    }, 
    { 
     "table-name":"relations", 
     "type":"many-to-one" 
    } 
]} 

元素位置

{ 
    "table-name": "elements_positions", 
    "joins":[ 
     { 
      "table-name":"elements", 
      "type":"many-to-one" 
     }, 
     { 
      "table-name":"positions", 
      "type":"many-to-one" 
     }, 
     { 
      "table-name":"types", 
      "type":"many-to-one" 
     } 
    ] 
} 

元素

{ 
     "table-name": "elements",  
     "joins":[ 
      { 
       "table-name":"elements_positions", 
       "type":"one-to-many" 
      }, 
      { 
       "table-name":"quadras", 
       "type":"many-to-many" 
      }, 
      { 
       "table-name":"dichotomies", 
       "type":"many-to-many" 
      } 
     ] 
    } 

位置

"table-name": "positions",  
    "joins":[ 
     { 
      "table-name":"elements_positions", 
      "type":"one-to-many" 
     } 
    ] 
} 

兩分法:

{ 
    "table-name": "dichotomies", 
    "joins":[ 
     { 
      "table-name":"elements", 
      "type":"many-to-many-inversed" 
     } 
    ] 
} 

回答

1

您的查詢有兩個不同的問題。

首先,多個參數值綁定單個參數。 $where['dichotomies']的每個下一個元素將替換查詢中參數:dichotomy的先前值。 setParameters()方法並不真正將值綁定到準備好的語句:它只是將它們存儲在QueryBuilder對象中。因此,在foreach循環結束後,所有條件將使用相同的值(最後的$where['dichotomies'])。爲了避免這種情況,您需要使用不同的參數名稱或數字索引。

其次,添加互相矛盾的條件:$QB->andWhere()會產生類似的東西:

Dichotomies.id = :dichotomy 
AND Dichotomies.id = :dichotomy 
AND Dichotomies.id = :dichotomy 
... 

一個實體明顯ID不能同時等於不同的值。因此,您需要由OR運營商替換AND

但更好的方法是使用IN條款:

調用setParameter()自動推斷哪種類型要設置的值。這適用於整數,字符串/整數數組,DateTime實例和管理實體。

通過以下線路只需更換的foreach循環:

$QB->andWhere('Dichotomies.id IN (:dichotomies)'); 
$QB->setParameters('dichotomies', array_column($where['dichotomies'], 'id')); 

array_column()函數返回所有二分法ID的列表。 Doctrine生成IN表達式並使用該列表生成查詢佔位符並綁定這些值。

+0

哦,是的,setParameter()每次都是覆蓋它! 但是Dichotomies表是元素的多對多的反面,元素對於ElementsPositions是一對多的,它有三個連接 - 類型,元素和位置。所以一個類型可以在位置1和2有兩個二分法(通過元素),我需要通過提供的二元二分法過濾掉 - 兩者都必須位於位置1或2.這就是爲什麼「和」不是「或」。但這不起作用 - 在發送兩個二分法的情況下,我不會得到任何結果,如果我更改爲「或」,則會得到與兩個二分法相匹配的結果。 –

+0

對不起,但這有點難以理解。你可以編輯你的查詢並提供你想要的原生SQL查詢嗎? – Timurib

+0

我害怕如果我知道它在純SQL中,我將能夠翻譯。我想說什麼,表「類型」可以有多個「類型」的「二分法」和「二分法」有「職位」。我需要檢查「Type」的(2)「Dichotomies」是否在「Positions」1或2中。我在概念上錯誤嗎? –