2016-04-28 2 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 в базе данных (Schema :: TYPE_DATETIME в миграции Yii), нет необходимости в str_to_date. Не могли бы вы дать более подробную информацию об атрибутах модели и связанных с ними типах столбцов базы данных? – karpy47

+0

Это нормально, что вы не понимаете, что у меня были проблемы со многими отношениями-отношениями, поэтому я решил создать модель, основанную на представлении. В этой связи я сохранил даты во французском формате. Вот почему я использую str_to_date для сравнения даты :) –

ответ

1

andFilterWhere и orFilterWhere не позволяют вложенности таким образом, так как они работают на объекте запроса - не на объекте условия. Вы можете определить ваш запрос таким образом:

$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 методы, потому что вы, вероятно, дон 't хотите удалить empty operands из запроса. Более подробную информацию о фильтрации можно найти here. where также содержит документы и и или операторов.

Как вы, наверное, уже знаете, счет может быть сделано с

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

Спасибо, но у меня есть последний вопрос '$ query-> where();' disable all my previous filters, вы знаете, почему и как это решить? –

+1

@ SamaëlVillette Я не знал, что у вас есть дополнительные вопросы. Вы можете использовать [иWhere] (http://www.yiiframework.com/doc-2.0/yii-db-query.html#andWhere%28%29-detail) или [илиWhere] (http: //www.yiiframework. com/doc-2.0/yii-db-query.html # илиWhere% 28% 29-detail). Но помните, что, как и методы фильтра, вложенность невозможна. Вы комбинируете одно условие с другим условием на и/или на уровне 0. Это похоже на то, что вы говорите 'SELECT ... FROM ... WHERE ... AND ... OR ...', но не 'SELECT ... FROM. .. ГДЕ ... И ... (... ИЛИ ...) '. Вложение может выполняться с помощью массивов. – robsch