laravel whereMonth не работает в коллекции - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу инициализировать коллекцию, которую я получу из таблицы, но если я использую 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 голосов
/ 01 апреля 2019
    $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 () работает не с экземпляром полученной коллекции, а с экземпляром построителя запросов, поэтому получение коллекции делает метод недоступным. как и код, который я скопировал выше, не получайте, пока не закончите с использованием всех построителей запросов. Надеюсь, это поможет.

0 голосов
/ 01 апреля 2019

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
 }

Как sidenote, это, вероятно, более эффективно, если вы делаете:

$student = student::with('branch', 'program')
          ->whereYear('date_of_signup', '2019')
          ->whereHas('program' => function ($query) {
               $query->where('name', '!=', 'Language Only');
          })
          ->get();

, который отфильтрует результаты, используя SQL-запрос вместо получения всего, а затем отфильтрует коллекцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...