在Laravel / Lumen Eloquent

时间:2016-05-01 13:33:33

标签: php mysql laravel eloquent lumen

我在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中做到这一点?

2 个答案:

答案 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