【问题标题】:Retrieve all rows from the last possible 3 years (Laravel + Eloquent)检索最近 3 年的所有行(Laravel + Eloquent)
【发布时间】:2020-03-20 17:50:47
【问题描述】:

我正在尝试获取模型中的所有行,但它必须是最近 3 年,好像我在 2020 年有结果但在 2019 年没有结果,那么它必须在 2018 年搜索, 2017 年,但如果我在 2019 年有结果,那么它必须只搜索 2018 年的结果。

我已经掌握了 whereBetween 的窍门,但是我没有使用以下查询从数据库中获得任何结果:

$year = $request->all();
$fromDate = $year['yearFrom'];
$toDate = $year['yearTo'];

return Tipico::whereBetween(
    DB::raw('date(created_at)'), [$fromDate, $toDate]
)
    ->get();

如您所见,我通过 post 方法获取年份,该方法为我提供了初始年份和结束年份,但它无法验证我正在搜索的信息,最好的方法是什么?

【问题讨论】:

  • $fromDate$toDate的内容是什么?
  • 通过邮局发送的带有年份的两个字符串。 $fromDate=2012$toDate=2020

标签: php mysql laravel filter eloquent


【解决方案1】:

使用 Carbon 创建日期:

$fromDate = Carbon::createFromDate($year['yearFrom'], 1, 1)->startOfDay();
$toDate = Carbon::createFromDate($year['yearTo'], 12, 31)->endOfDay();

那么在您的查询中,created_at 已经是一个日期时间,所以:

return Tipico::whereBetween('created_at', [$fromDate, $toDate])->get();

记得在你的类的顶部包含 Carbon:

use Illuminate\Support\Carbon;

或只有

use Carbon\Carbon;

要获取过去 3 年的数据,一种选择是运行查询以查看哪些年份有您需要的数据。

所以,让我们使用yearTo 作为他的参考,并选择数据的前 3 年:

$years = Tipico::select(\DB::raw('YEAR(created_at) as years'))
               ->where('created_at', '<=', $toDate)
               ->distinct()
               ->orderByRaw('YEAR(created_at) DESC')
               ->limit(3)
               ->get();

现在在$years,您将拥有 3 年。现在您可以使用 this years 作为参数运行查询:

return Tipico::whereIn(\DB::raw('YEAR(created_at)'), $years)->get();

*不确定是否可以直接传递$years 或需要转换为数组。看看吧。

【讨论】:

  • 谢谢,这可以完美地获得从第一年到去年的结果,但是我怎样才能获得最近 3 年的结果以便从数据库中获取第一年而不是来自用户?
  • 已编辑,看看@EmilianoPérez
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2015-02-07
  • 2019-03-04
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多