laravel whereMonth在集合中不起作用

时间:2019-04-01 08:39:44

标签: php mysql laravel eloquent

我想初始化一个从表中获取的集合,但是如果我在该集合上使用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错误发生的地方。

第一个代码实际上有效,但是我想编写一个简短高效的代码。

2 个答案:

答案 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()方法不适用于获取的集合实例,但不适用于查询生成器实例,因此获取该集合会使该方法不可访问。就像我上面复制的代码一样,在使用完所有查询构建器之前,请不要获取。我希望这会有所帮助。