У меня много проблем с тем, чтобы получить очень-вложенные отношения, чтобы правильно работать в laravel.
Желаемое поведение выглядит следующим образом:
Я выбираю событие по идентификатору, и я хочу посмотреть, кто из них подписался на него. Теперь проблема в том, что между событием и человеком есть несколько таблиц.
Это запрос, который работает!
select persons.id, persons.firstname, persons.lastname, event_scores.score from events join cities on cities.id = events.city_id join companies on cities.id = companies.city_id join persons on companies.id = persons.company_id join event_scores on event_scores.person_id = persons.id where event_scores.event_id = 1 group by persons.id
class Event extends Eloquent { protected $table = 'events'; public function city() { return $this->belongsTo('City'); } }
class City extends Eloquent { protected $table = 'cities'; public function companies() { return $this->hasMany('Company'); } public function event() { return $this->hasMany('Event'); } }
class Company extends Eloquent { protected $table = 'companies'; public function persons() { return $this->hasMany('Person'); } public function city() { return $this->belongsTo('City'); } }
class Person extends Eloquent { protected $table = 'persons'; public function company() { return $this->belongsTo('Company'); } public function eventscore() { return $this->belongsToMany('Event', 'event_scores', 'person_id', 'event_id') ->withPivot('score') ->withTimestamps(); } }
return Event::with('city')->with('company')->get();
а также
return Event::with('city') ->whereHas('companies', function($query) use ($company_id){ $query->where('company_id', $company_id); })->get();
И многие другие возможности, я действительно застрял на этом. Неужели так трудно в laravel достичь такого отношения вложенных отношений?
Благодаря!
return Event::with('city.companies.persons')->get();
Если вы хотите только выбрать определенные поля из таблицы persons
, используйте следующее:
return Event::with(['city.companies.persons' => function ($query) { $query->select('id', '...'); }])->get();
Для конкретных городов и компаний вам необходимо распределить их с красноречивым. Например:
return Event::with([ 'city' => function ($query) { $query->select('id', '...'); }, 'city.companies' => function ($query) { $query->select('id', '...'); }, 'city.companies.persons' => function ($query) { $query->select('id', '...'); } ])->get();