我在Lumen为汽车保险公司制作API,在他们的 mysql 数据库表中,他们有两个日期(开始日期和结束日期)。
我需要创建一个方法来返回一个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 :(得分: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
就好了。
答案 1 :(得分:0)
谢谢。我的TL特别告诉我不要使用DB :: raw(),所以不幸的是这不是一个选项。我设法得到了这样的所有日期:
$startDates = $this->model->select('start_date');
$dates = $this->model->select('end_date')->union($startDates)->orderBy('end_dates')->get();
Union会自动只返回不同的行,所以我得到了我需要的日期列表,而且我很容易将这些年份提取出来:
$date->end_date->year