Коллекция Laravel с несколькими фильтрами даты с оператором или - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь отфильтровать несколько предметов из коллекции в Laravel 5.7.У элементов есть начальная дата и (необязательная) конечная дата.

Фильтр, который я пытаюсь создать, следующий:

startdate <= now() AND

( enddate >= now() ИЛИ enddate = '' ИЛИ enddate = NULL )

Я пробовалследующее, но это не работает:

$this->items->where([  
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '>=', date('Y-m-d')]
])->orWhere([
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '=', '']
])->orWhere([
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '=', null]
]);

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Благодаря Марсину Набиалеку у меня есть решение.

Мне пришлось использовать $this->items() вместо $this->items и мне пришлось добавить его с помощью функции ->get().

Результат:

$this->items()->where('startdate', '<=', date('Y-m-d'))
              ->where(function($q) {
                  $q->where('enddate', '>=', date('Y-m-d'))
                    ->orWhere('enddate', '')
                    ->orWhereNull('enddate');
              })->get();
0 голосов
/ 10 декабря 2018

Более понятным способом было бы использовать замыкание следующим образом:

$this->items->where('startdate', '<=', date('Y-m-d'))
            ->where(function($q) {
                 $q->where('enddate', '>=', date('Y-m-d'))
                   ->orWhere('enddate', '')
                   ->orWhereNull('enddate');
             });

И, вероятно, как предложено в комментарии, вы на самом деле должны использовать items() вместо items, потому что, используя items, вы, вероятно, получаете элементыиз базы данных вместо добавления ограничений в запрос к базе данных ранее.

...