2016-05-01 2 views
0

Я делаю API в Lumen для компании по страхованию автомобилей, в своей таблице базы данных mysql у них есть две даты (дата начала и дата окончания) для каждого средство передвижения.Получайте все годы между двумя датами в Laravel/Lumen Eloquent

Мне нужно создать метод возврата ответа JSON со всеми возможными годами в между начальной и конечной датой. Например, если start_date - 1992-02-10, а end_date - 1994-02-24, тогда мне нужно вернуть[1992, 1993, 1994]и так далее.

Мне было интересно, есть ли способ сделать это через Eloquent/SQL или если мне нужно будет загружать все даты и фильтровать их на PHP.

Если да, то как мне следует объединить строки обоих столбцов в один результирующий набор с уникальными годами в Eloquent? Опять же, если это возможно, я бы хотел просто получить годы из БД, а не всю дату.

SELECT YEAR(start_date) from logodb.vehicles 
UNION 
SELECT YEAR(end_date) from logodb.vehicles 

В vanilla MySQL я могу получить уникальные даты, как это, но как это сделать в Eloquent?

ответ

0

Вы можете использовать DB::raw вместо магии модели Laravel/Eloquent практически в любом случае.

https://laravel.com/docs/5.2/database#running-queries

User::addSelect(DB::raw("YEAR(start_date) AS `start_year`")) 
    ->addSelect(DB::raw("YEAR(end_date) AS `end_year`")) 
    ->get(); 

Это, например, будет возвращать объект модели с $user->start_year сравнявшись результат YEAR(start_date).

Я не уверен, какова цель вашего UNION. Документация MySQL говорит, что она присоединяется к операторам SELECT, но вы должны иметь возможность делать YEAR(end_date) AS end_year просто отлично.

0

Спасибо. Мой TL сказал мне, что конкретно не использовать DB :: raw(), однако, к сожалению, это был не вариант. Мне удалось получить все даты, как это:

$startDates = $this->model->select('start_date'); 
$dates = $this->model->select('end_date')->union($startDates)->orderBy('end_dates')->get(); 

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

$date->end_date->year 
Смежные вопросы