我想初始化一个从表中获取的集合,但是如果我在该集合上使用whereMonth,则表明whereMonth不存在。
我使用whereHas代替初始化一个集合,但这变成了很长的代码,仍然有可能简化为更有效的代码。
$makati = [];
$cebu = [];
$davao = [];
for($x = 1; $x <= 12; $x++){
$makati[$x-1] = student::with('branch', 'program')
->whereHas('branch', function($query){
$query->where('name', '!=', 'Language Only');
})
->whereHas('branch', function($query) {
$query->where('name', 'Makati');
})->whereMonth('date_of_signup', $x)->whereYear('date_of_signup', '2019')->count();
}
这工作得很好,但是请注意,我将对$ cebu和$ davao数组执行相同的代码。
$student = student::with('branch', 'program')->whereYear('date_of_signup', '2019')->get();
$student = $student->where('program.name', '!=', 'Language Only');
$makati = [];
$cebu = [];
$davao = [];
for($x = 1; $x <= 12; $x++){
$makati[$x-1] = $student->whereMonth('date_of_signup', $x);
info($makati);
}
我已经尝试过了,但这是whereMonth错误发生的地方。
第一个代码实际上有效,但是我想编写一个简短高效的代码。
答案 0 :(得分:0)
whereMonth('x', 1)
是生成SQL WHERE MONTH(x)=1
的快捷方式。尽管已尽最大努力使集合方法与查询构建器方法匹配,但SQL查询通常不会映射到集合。解决方法是:
$student = student::with('branch', 'program')->whereYear('date_of_signup', '2019')->get();
$student = $student->where('program.name', '!=', 'Language Only');
$makati = [];
$cebu = [];
$davao = [];
for($x = 1; $x <= 12; $x++){
$makati[$x-1] = $student->filter(function ($value) use ($x) {
return $value->date_of_signup->month == $x;
});
info($makati);
}
这假设使用模型中的date_of_signup
属性检索到$dates
时,其日期正确。
这是在您的student
模型中完成的:
class student extends Model {
protected $casts = [ 'date_of_signup' => 'date' ];
// rest of model
}
作为旁注,这样做可能会更有效:
$student = student::with('branch', 'program')
->whereYear('date_of_signup', '2019')
->whereHas('program' => function ($query) {
$query->where('name', '!=', 'Language Only');
})
->get();
它将使用SQL查询过滤结果,而不是获取所有内容,然后对集合进行过滤
答案 1 :(得分:0)
$student = student::with('branch', 'program')->whereYear('date_of_signup', '2019');
$student = $student->where('program.name', '!=', 'Language Only');
$makati = [];
$cebu = [];
$davao = [];
for($x = 1; $x <= 12; $x++){
$makati[$x-1] = $student->whereMonth('date_of_signup', $x)->get();
info($makati);
}
我认为whereMonth()方法不适用于获取的集合实例,但不适用于查询生成器实例,因此获取该集合会使该方法不可访问。就像我上面复制的代码一样,在使用完所有查询构建器之前,请不要获取。我希望这会有所帮助。