根据模型中的生日年龄过滤Laravel集合

时间:2017-06-15 15:49:06

标签: php laravel eloquent

好的,我正用这个拔出头发:

我正在使用Laravel / Eloquent和PHP。我有一个Cadet模型,其出生日期DATE字段为birthday

在控制器中,我正在检索符合各种条件的Cadet模型集合,但我也希望根据每个Cadet的年龄来过滤集合(即{ {1}}集合应该只有$output个模型超过最低年龄。)

Cadet是我希望过滤Collection的最小年龄(整数)。

所以,这就是我一直想做的事情:

$activity->age_min

问题是,尽管知道至少有两个$output = $cadets->where('*, TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age', '>', $activity->age_min); 记录符合标准,但我得到一个空数组。如果我在末尾添加Cadet,那么db就会崩溃。

任何人都可以指出我正确的方向让这一点发挥作用,以便->get();包含$output模型的集合,其中Cadet的年龄超过{1}}吗?

更新

好吧,好吧,我已经尝试了btl的建议而无法让它们工作,因为我需要计算每个学员的年龄并将其与整数进行比较以决定是否排除它们。

我在下面玩了一个关于lesssugar的想法的游戏并且做到了这一点:

$activity->age_min

...但是我正在试图弄清楚如何使用过滤器功能,并让它只返回出生日期比$ max_date更新的学员。

我想我今天已经在这里待了太久,所以我踩了一会儿。我们将非常感激地提供任何帮助或建议(特别是答案!)! :)

2 个答案:

答案 0 :(得分:1)

好的,经过一番思考后,这就是我想出来的:

      // Work out a date for which people must be born BEFORE to be included
      $max_date = \Carbon\Carbon::parse($activity->date_from)->subYears($activity->age_min);
      // Filter the collection
      $cadets = $cadets->filter(function($cadet) use ($max_date) {
              if (\Carbon\Carbon::parse($cadet->birthday)->lte($max_date)) {
                    return true;
              }
          }
      });

感谢@lesssugar提出的filter()建议。首先使用Carbon,它很容易创建一个日期(减去年龄限制),这是确定学员是否足够老或不包含在集合中的阈值($max_date)。

然后我在现有的收藏品上运行一个过滤器,只挑选我感兴趣的生日小于或等于$max_date的记录。

最初我以为我可以在一个查询中执行此操作,但这是我已经达到的解决方案,并且希望工作量不会太多。

答案 1 :(得分:0)

使用Carbon,它可以轻松处理这类日期比较。

$cadets = Cadet::where(Carbon::parse('birthday'), '>=', $activity->age_min)->get();

$cadets = Cadet::all()->each(function($cadet) use ($activity) {
    return Carbon::parse($cadet->birthday)->gt(Carbon::parse($activity->age_min);
});