Как проверить, пересекается ли период между двумя датами с массивом лет - PullRequest
0 голосов
/ 05 мая 2020

У меня есть проект Laravel. Моя модель имеет метки времени полей «начало» и «конец». В запросе есть параметр в виде массива лет, et c: years = [2019, 2021, ...].

Я хотел бы получить по Model::where(...), Model::whereIn(...) или чему-то еще, все записи, которые пересекаются с параметром «years» .

Пример:

Если years = [2019, 2021], мне нужно получить записи с start = "2018-01-01", end = "2019-12-31" или start = "2018-01-01", end = "2025-12-31", но НЕ start = "2020-01-01", end = "2020-12-31".

Как я могу это сделать?

1 Ответ

0 голосов
/ 05 мая 2020

Как насчет следующего решения:

use Illuminate\Database\Eloquent\Builder;

$years = [2019, 2021];

Model::where(
    static function (Builder $query) use ($years) {
        foreach ($years as $year) {
            $start = "{$year}-01-01";
            $end = "{$year}-12-31";
            $query->orWhereRaw("('{$start}' BETWEEN `start` AND '{$end}' OR `start` BETWEEN '{$start}' AND '{$end}')");
        }
    }
);

OR

use Illuminate\Database\Eloquent\Builder;

$years = [2019, 2021];

Model::where(
    static function (Builder $query) use ($years) {
        foreach ($years as $year) {
            $query->orWhere(
                static function (Builder $query) use ($year) {
                    $query->whereYear('start', $year)
                        ->whereYear('end', $year);
                }
            );
        }
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...