Наименьшее и самое большое значение даты из нескольких таблиц - PullRequest
1 голос
/ 23 мая 2019

Есть ли какой-нибудь способ "Laravel-ish", чтобы фиксировать самые ранние и самые поздние даты из нескольких полей дат в нескольких таблицах laravel?

таблица для model1:

fielda |fieldb |date1

таблица2 для модели2:

fieldc |fieldd |date1 |date2

Я не мог найти элегантный способ сделать это.Мой текущий подход выглядит примерно так:

$model1_dates = Model1::select(\DB::raw('MIN(date1) as min_date'), \DB::raw('MAX(date1) as max_date'))->get(); $model2_dates = Model2::select(\DB::raw('MIN(date2) as min_date'), \DB::raw('MAX(date2) as max_date'))->get(); $model2_dates2 = Model2::select(\DB::raw('MIN(date2) as min_date'), \DB::raw('MAX(date1) as max_date'))->get();

После этого я сравню результаты и получу минимум и максимум из этих ...

Какие подходы будутлучше?

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Я использовал Laravel, но я не фанат - так что я действительно не знаю "Laravel-ish" или что это такое.Если вы имеете в виду «что-то, что выглядит просто», то это может быть

$minDate = collect([
    Model1::min('date1'),
    Model2::min('date1'),
    Model2::min('date2'),
])->min();

$maxDate = collect([
    Model1::max('date1'),
    Model2::max('date1'),
    Model2::max('date2'),
])->max();

Это замечательно - но это 6 запросов к БД.

Один необработанный SQL будет

select min(min_date) as min_date, max(max_date) as max_date
from (
    select min(date1) as min_date, max(date1) as max_date from table1
    union all
    select min(date1) as min_date, max(date1) as max_date from table2
    union all
    select min(date2) as min_date, max(date2) as max_date from table2
) x

или

select min(min_date) as min_date, max(max_date) as max_date
from (
    select min(date1) as min_date, max(date1) as max_date
    from table1
    union all
    select min(least(date1, date2))    as min_date,
           max(greatest(date1, date2)) as max_date
    from table2
) x

в зависимости от того, какие у вас индексы.Первый запрос выполняется лучше, когда каждый столбец даты имеет свой собственный индекс.

1 голос
/ 23 мая 2019

Да, есть такие функции, как max() и min(). Также вы можете объединить два запроса методом union() Совокупные методы Union

И вы также можете использовать orderBy с Laravel. Работает также на свиданиях. OrderBy

Самый быстрый способ:

$minDateModel1 = Model1::min('date1');
$maxDateModel1 = Model1::max('date1');

Или:

$minDateModel1 = Model1::oldest('date1')->first()->pluck('date1');
$maxDateModel1 = Model1::latest('date1')->first()->pluck('date1');

Или:

$minDateModel1 = Model1::max('date1');

//should be the oldest first, newest at last
$minDateModel1 = Model1::orderBy('date1', 'asc')->first()->pluck('date1');
$maxDateModel1 = Model1::orderBy('date1', 'asc')->first()->pluck('date1');

Должен сделать трюк:

$minDateModel1 = Model1::max('date1');
$minDateModel21 = Model2::max('date1');
$minDateModel22 = Model2::max('date2'); 
$allMinDates = $allMinDates->merge($minDateModel1);
$allMinDates = $allMinDates->merge($minDateModel21);
$allMinDates = $allMinDates->merge($minDateModel22);
$min = $allMinDates->min();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...