Laravel запрос не работает при использовании в качестве области - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь найти записи по временному интервалу. В таблице есть столбцы типа 'date_from' и 'date_to', которые указывают дату начала и окончания события.

public function scopeByTimeInterval($query, $dateInterval)
{
    $query->where(function ($query) use ($dateInterval) {
        [$from, $to] = $dateInterval;
        $query->where([
            ['date_from', '<=', $from],
            ['date_to', '>=', $to]
        ]);
        $query->orWhere([
            ['date_from', '>=', $from],
            ['date_to', '<=', $to]
        ]);
        $query->orWhereBetween('date_from', $dateInterval);
        $query->orWhereBetween('date_to', $dateInterval);
    });
}

, когда я использую запрос where напрямую, проблем нет. Я могу видеть все события между этими датами. Но если я использую его как область действия, он возвращает мне все события в данном году и месяце, а не интервал.

Что может вызвать такое поведение? Или я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Как уже упоминалось в комментариях, ваш запрос по сути выбирает все. Если вы пытаетесь получить события, которые происходят во время дат $from и $to, вы можете сделать что-то вроде:

public function scopeDateInterval($query, $interval)
{
    [$from, $to] = $interval;

    $query
        ->where(function ($query) use ($from, $to) {
            $query
                ->where(function ($query) use ($from) {
                    $query
                        ->where('date_from', '<=', $from)
                        ->where('date_to', '>=', $from);
                })
                ->orWhere(function ($query) use ($to) {
                    $query
                        ->where('date_from', '<=', $to)
                        ->where('date_to', '>=', $to);
                })
                ->orWhere(function ($query) use ($from, $to) {
                    $query
                        ->where('date_from', '>=', $from)
                        ->where('date_to', '<=', $to);
                });

        });
}

Выше в основном говорится, где $from или $to находится между начальной и конечной датами, либо начальная и конечная даты находятся между $from и $to.

0 голосов
/ 11 января 2020

Думаю, ты скучаешь return $query->where...

...