如何在过滤器 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(),
]);
}
}
我想在 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(),
]);
}
}