如何在过滤器 Laravel 中使用 whereYear

How do I use whereYear inside filter Laravel

我想在 created_at 年过滤一个集合。 Laravel 5.3。我正在尝试在我的过滤器中使用 whereYear 但它正在唤醒该方法未定义。我该如何定义它?或者,还有更好的方法?

      $datas = Campaign::all();

      if($request->year) {
         $value = $request->year;
         $datas = $datas->filter(function($data) use ($value) {
             return $data->created_at->whereYear($value);
         });
       }

whereYear(...) 对于 Laravel 中的 where('year', ...) 是 shorthand,但您希望针对 created_at 进行搜索,因此这将行不通。这样的事情应该可以解决问题,并减少您必须从数据库中获取的记录数量:

// better to let the database handle the search
// than fetching all records and filtering the collection
$query = Campaign::query();

if($request->year) {
    // be sure to validate $request->year somewhere, for obvious reasons...
    $query->whereBetween('created_at', $request->year . '-01-01 00:00:00', $request->year . '-12-31 23:59:59')
}

return $query->get();

In laravel created_at 是 Carbon 的一个实例,所以 :

$datas = Campaign::all();

if($request->year) {
    $value = $request->year;
    $datas = $datas->filter(function($data) use ($value) {
        return $data->created_at->year == $value;
    });
}

我会做得更紧凑:

因此在您的控制器中您可以执行以下操作:

$datas = ($request->year)
       ? Campaign::inYear($request->year)->get()
       : Campaign::all();

优点是,您仅从数据库中获取您需要的记录,而不必对集合进行任何类型的筛选。这也会提高你的表现一点点。

在您的广告系列模型中,您添加的 inYear 范围比 可重用 :

use Carbon\Carbon;

class Campaign extends Model
{
    public function scopeInYear($query, $year)
    {
        return $query->whereBetween('created_at', [
            Carbon::create($year)->startOfYear(),
            Carbon::create($year)->endOfYear(),
        ]);
    }
}