Laravel: отношение hasMany разрывает запрос с предложением where - PullRequest
0 голосов
/ 16 февраля 2019

Это мой первый проект Laravel, так что, возможно, я что-то неправильно понимаю.

У меня есть Clients и Campaigns контроллеры, и клиенты настроены с hasMany кампаниями

class Client extends Model
{
    public function campaigns(){

        return $this->hasMany('App\Campaign');

    }
}

в методе Clients Show, этот запрос не работает:

$client = Client::find($id);
$campaigns = $client->campaigns
                 ->where(function($query) use($startdate, $enddate) {
                     $query->wherebetween('start_date', [$startdate, $enddate])
                           ->orwherebetween('end_date', [$startdate, $enddate]);
                 })
                 ->sortBy('start_date')
                 ->groupBy(function($val) {
                     return Carbon::parse($val->start_date)->format('F Y');
                 });

Я получаю сообщение об ошибке: explode() expects parameter 2 to be string, object given На странице ошибки отображается красная линия на }) после предложения orwhereBetween.

Но этот запрос работает:

$campaigns = DB::table('campaigns')
                 ->where('client_id', $client->id)
                 ->where(function($query) use($startdate, $enddate) {
                     $query->wherebetween('start_date', [$startdate, $enddate])
                           ->orwherebetween('end_date', [$startdate, $enddate]);
                 })
                 ->orderBy('start_date')
                 ->get()
                 ->groupBy(function($val) {
                     return Carbon::parse($val->start_date)->format('F Y');
                 });

Моя проблема в том, что второй запрос не позволяет мне получить доступ к $campaign->tasks, когда я нахожусь в представлении представления, которое мне нужно.

Итак, кто-нибудь знает, почему предложение where может вызвать проблемы при доступе к $client->campaigns, но не при использовании DB?

1 Ответ

0 голосов
/ 16 февраля 2019

Это потому, что перед вызовом метода get объект является экземпляром класса Eloquent Builder , а метод groupBy не принимает какой-либо параметр в качестве замыкания,Однако после вызова метода get он изменяется на экземпляр класса Collection , который также имеет метод groupBy и принимает закрытие.

Кстати sortBy не принадлежит Eloquent Builder , вместо этого вы должны использовать orderBy перед выполнением запроса с использованием метода get .

Вот доступные методы Collection

https://laravel.com/docs/5.7/collections#available-methods

Попробуйте этот код и не забудьте вызвать методы верблюдом, иначе это может привести к серьезным проблемам.при развертывании.

 $dates = $client->campaigns()
        ->where(function($query) use($startdate, $enddate) {
            $query->whereBetween('start_date', [$startdate, $enddate])
                ->orWhereBetween('end_date', [$startdate, $enddate]);
        })
        ->orderBy('start_date')
        ->get()
        ->groupBy(function($val) {
            return Carbon::parse($val->start_date)->format('F Y');
        });
        foreach($dates as $campaigns){
           foreach($campaigns as $campaign){
             dump($campaign->tasks);
           }
        }
...