问题描述
我在Laravel中正确工作时遇到了很麻烦的关系.
想要的行为如下,
我选择ID事件,我想看看哪些人订阅了它. 现在问题是事件与人之间有一些表.
这是有效的查询!
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();
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();
其他推荐答案
return Event::with(['city:id,name', 'city.companies:id,name', 'city.companies.persons:id,name'])->get();
问题描述
I'm having trouble getting a very-nested relationship to work correctly in laravel.
The wanted behaviour is as follows,
I select an event by ID and i want to see which persons are subscribed to it. Now the problem is there are some tables between the event and the person..
This is the query that works!
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
These are my relations
Event Model
class Event extends Eloquent { protected $table = 'events'; public function city() { return $this->belongsTo('City'); } }
City Model
class City extends Eloquent { protected $table = 'cities'; public function companies() { return $this->hasMany('Company'); } public function event() { return $this->hasMany('Event'); } }
Company Model
class Company extends Eloquent { protected $table = 'companies'; public function persons() { return $this->hasMany('Person'); } public function city() { return $this->belongsTo('City'); } }
Person Model
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(); } }
What I have tried
return Event::with('city')->with('company')->get();
and
return Event::with('city') ->whereHas('companies', function($query) use ($company_id){ $query->where('company_id', $company_id); })->get();
And many other possibilities, I'm really stuck on this. Is it so difficult in laravel to achieve this kind of nested relationship linking?
Thanks!
推荐答案
return Event::with('city.companies.persons')->get();
If you only want to select certain fields from the persons table, use this:
return Event::with(['city.companies.persons' => function ($query) { $query->select('id', '...'); }])->get();
其他推荐答案
For city and companies specific fields , you need to distribute the with eloquent. Eg:
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();
其他推荐答案
return Event::with(['city:id,name', 'city.companies:id,name', 'city.companies.persons:id,name'])->get();