2017-08-20 49 views
1

我試圖在cakephp 3.X中構建一個查詢,結構如下: A和B和C以及[D或E]其中A,B,C,D,E包含一個用OR條件連接的值數組像如何使用CakePHP 3.x查詢構建器表示OR條件?

$schools = $schools->where(['A IN' => $arrayOfAOptions]), 
$schools = $schools->where(['B IN' => $arrayOfBOptions]), 
$schools = $schools->where(['C IN' => $arrayOfCOptions]) 

// want this to be firstly joined with OR before joining other conditions with AND 
$schools = $schools->where(['D IN' => $arrayOfCOptions]) 
//or 
$schools = $schools->where(['E IN' => $arrayOfCOptions]) 

這裏的問題是,我無法獲得域d和E被分離OR和大家一起和CakePHP中2

,我設法用以下代碼

來實現它
$queryConditions = array(
    'or'=> array_merge(
    array(
     'School.D' => $this->Session->read('conditions.D') 
    ), 
    array(
     'School.E' => $this->Session->read('conditions.E') 
    ) 
) 
); 

befo重新合併到條件的其餘 任何幫助將不勝感激

+0

我們生活在2017年,你應該使用'[ '鍵'=> '值']',而不是古'array()',因爲它對格式化有很大的幫助(除非你需要向後兼容性(這裏講PHP <5.4,古老且應該被遺忘))。至於你的問題,這似乎是可靠的,我沒有你的答案。但是,你已經完成了你的研究,對你而言是一個讚許。 – Xorifelse

+0

這只是讓你知道我在遷移到蛋糕3.0和PHP 7之前做了什麼 –

回答

1

您可以使用與CakePHP 2.x相同的樣式,即傳遞嵌套在OR鍵下的條件。你也可以在一個where()呼叫中包裝這個。

$schools->where([ 
    'A IN' => $arrayOfAOptions, 
    'B IN' => $arrayOfBOptions, 
    'C IN' => $arrayOfCOptions, 
    'OR' => [ 
     'D IN' => $arrayOfDOptions, 
     'E IN' => $arrayOfEOptions 
    ] 
]); 

你也可以使用orWhere(),但最近it has been deprecated作爲其行爲是有點脆弱。

最後,您可以使用表達式來創建複雜的條件。該or_()表達方法可用於創建OR條件:

$schools->where(function ($expr) use ($arrayOfAOptions, $arrayOfBOptions) { 
    return $expr->or_([ 
     'A IN' => $arrayOfAOptions, 
     'B IN' => $arrayOfBOptions, 
    ]); 
}); 

參見Cookbook > Database Access & ORM > Query Builder > Advanced Conditions