2016-04-28 74 views
1

我要添加過濾條件與yii2框架創建和條件,這種情況有可能產生以下請求:yii2如何在另一個

select count(*) from v_ressource 
where 
(
    (
     str_to_date('27/04/2016', '%d/%m/%Y') 
     between str_to_date(erDateDebut, '%d/%m/%Y') 
     and str_to_date(erDateFin, '%d/%m/%Y') 
    ) 
    and erDateFin is not null 
) 
or 
(
    (
     str_to_date('27/04/2016', '%d/%m/%Y') 
     between str_to_date(erDateDebut, '%d/%m/%Y') 
     and now() 
    ) 
    and erDateFin is null 
); 

正如你可以看到有「和」條件成'或'條件。

我在我的ModelSearch以下代碼:

$query 
     ->andFilterWhere([ 
      'between', 
      'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
      new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
      new Expression('str_to_date(erDateFin, \'%d/%m/%Y %H:%i\')'), 
     ]) 
     ->andFilterWhere([ 
      'not', ['erDateFin' => null], 
     ]); 

    $query 
     ->orFilterWhere([ 
      'between', 
      'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
      new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
      new Expression('now()'), 
     ]) 
     ->andFilterWhere([ 
      'is', 'erDateFin', null, 
     ]); 

的兩個爲空並且不爲空的條件不會出現在所生成的請求,並且沒有「嵌套」的條件(條件和在或條件)

感謝您的幫助

+0

做不明白狀況的。第一個操作數('之後')應該是一個數據庫列名稱。現在它似乎是一個帶有mysql表達式的字符串。另外我沒有使用str_to_date。如果列中的數據庫中有DateTime類型(Yii遷移中的Schema :: TYPE_DATETIME),則不需要str_to_date。你能否提供一些關於模型屬性和相關數據庫列類型的更多細節? – karpy47

+0

沒關係,你不明白我有多對多的關係查詢問題,所以我決定創建一個基於視圖的模型。在這種觀點下,我用法文格式存儲日期。所以這就是爲什麼我使用str_to_date來比較日期:) –

回答

1

andFilterWhereorFilterWhere不允許,因爲它們查詢對象進行操作築巢這種方式 - 而不是在條件對象。您可以定義查詢是這樣的:

$query->where(
    ['and', 
     [ 
      'between', 
      'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
      new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
      new Expression('str_to_date(erDateFin, \'%d/%m/%Y %H:%i\')'), 
     ], 
     [ 
      'not', ['erDateFin' => null], 
     ] 
    ]); 

$query->orWhere(
    ['and', 
     [ 
      'between', 
      'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
      new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
      new Expression('now()'), 
     ], 
     [ 
      'is', 'erDateFin', null, 
     ] 
    ]); 

你甚至可以把它所有到一個where方法調用:

$query->where(
    ['or', 
     ['and', 
      [ 
       'between', 
       'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
       new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
       new Expression('str_to_date(erDateFin, \'%d/%m/%Y %H:%i\')'), 
      ], 
      [ 
       'not', ['erDateFin' => null], 
      ] 
     ], 
     ['and', 
      [ 
       'between', 
       'str_to_date(\'' . $this->dateRecherche . '\', \'%d/%m/%Y %H:%i\')', 
       new Expression('str_to_date(erDateDebut, \'%d/%m/%Y %H:%i\')'), 
       new Expression('now()'), 
      ], 
      [ 
       'is', 'erDateFin', null, 
      ] 
     ] 
    ]); 

我已經使用了where方法,而不是filterWhere方法,因爲你可能不要不想從查詢中刪除empty operands。有關過濾的更多信息,請參閱herewhere也記錄了運營商。

正如你可能已經知道,計數可以

$count = $query->count(); 
+0

謝謝,但我有最後一個問題'$ query-> where();'禁用我以前的所有過濾器,你知道爲什麼以及如何解決? –

+1

@SamaëlVillette我不知道你有進一步的疑問。您可以使用[andWhere](http://www.yiiframework.com/doc-2.0/yii-db-query.html#andWhere%28%29-detail)或[orWhere](http://www.yiiframework。 com/doc-2.0/yii-db-query.html#orWhere%28%29-detail)。但請記住,像過濾方法一樣,嵌套是不可能的。你可以在0級和/或0級上合併一個條件和另一個條件。就像你說'SELECT ... FROM ... WHERE ... AND ... OR ...',但不是'SELECT ... FROM'。 ..在哪裏...和...(...或...)'。嵌套可以用數組完成。 – robsch