Сложная сортировка по дате Yii2

Я создаю поиск в yii2.

$q = $_GET['q'];

$dataProvider = new ActiveDataProvider([
    'query' => company::find()
        ->where('name like :name', [':name' => "$q%"])
]);
return $this->render('index', ['dataProvider' => $dataProvider,]);

У меня также есть два свойства даты (действительный платеж от и до):

from_date and to_date

Мне нужно сначала отобразить результат, начиная с того, у кого есть действующий платеж.

Как должен выглядеть запрос, если я хочу сначала отобразить компании с действительным платежом? Все они должны сортироваться по имени ASC ..

У меня есть функция для получения этого значения в модели, но не в запросе:

public function getValidPayment()
{
    $today = date("Y-m-d");
    return (($this->from_date <= $today) && ($today <= $this->to_date));
}

Это yii2

Спасибо!

Изменить: просто чтобы уточнить, что мне нужно:

  1. Запрашивать компании по имени (имя, например: имя ')
  2. приоритет тот, который действителен с и по сегодняшний день (from_date и to_date)
  3. отображать остальные, для которых нет действительной даты от и до (обе группы в запросе должны сортироваться по имени ASC).

Может, стоит сделать это в 2-х запросах и как-то их объединить?


person code-zoop    schedule 29.03.2015    source источник
comment
Где вы это реализуете? В 1_?   -  person arogachev    schedule 29.03.2015
comment
Я использую поставщик данных, но перебираю их в индексном представлении с помощью цикла for. Проблема заключается в правильном порядке запроса. Это большая база данных, в которой перечислен один миллион компаний.   -  person code-zoop    schedule 29.03.2015


Ответы (1)


'query' => company::find()
  ->select([
    'valid_payment'=>"(('".$today."'<=to_date) AND (from_date<='".$today."'))",
    name,
    //...some fields you required in your grid
  ])
  ->where('name like :name', [':name' => "$q%"])
  ->orderBy('valid_payment DESC, name ASC')

и не забудьте инициализировать $ сегодня

person user1852788    schedule 30.03.2015
comment
Спасибо. но будет ли запрос также включать все элементы, у которых нет действительных с и по настоящее время? Потому что у большинства компаний его нет, но мне нужно отдать предпочтение тому, у которого есть действующий с и по настоящее время. - person code-zoop; 30.03.2015
comment
обновленный ответ, проверьте этот способ - добавьте поле логики в select с псевдонимом и сначала отсортируйте по этому полю - person user1852788; 30.03.2015