我正在使用Eloquent ORM,我希望设置一个急切的加载来查询尽可能少的数据。
我有三个表countries
,states
和cities
,我希望获得某个国家/地区的所有州和城市,而无需有关该国家/地区的其他信息。< / p>
我的模特:
国家
public function states () {
return $this->hasMany(State::class);
}
国家
public function country () {
return $this->belongsTo(Country::class);
}
public function cities () {
return $this->hasMany(City::class);
}
市
public function state () {
return $this->belongsTo(State::class);
}
例如,获取美国所有州和城市。我想得到如下数据。
[
{
id: 1,
name: 'California',
cities: [
{
id: 1,
name: 'Los Angeles'
}
]
}
]
如何只使用Eloquent ORM帮助程序,没有where
或原始SQL?
答案 0 :(得分:0)
您可以限制这样的列:
Country::with('states:id,name,country_id', 'states.cities:id,name,state_id')->get(['id']);
您必须选择外键列,因为它们是匹配结果所必需的。
您还可以将其集成到states
关系中:
public function states () {
return $this->hasMany(State::class)->select('id', 'name', 'country_id')
->with('cities:id,name,state_id');
}
当您访问/加载cities
时,这将自动加载states
。
答案 1 :(得分:0)
你可以这样:
$data = Country::with([
'states' => function ($query) {
$query->with([
'cities'
]);
}
])->get(['id']);
这更具可读性,不需要原始查询