Php 如何使用即时加载来查询尽可能少的数据?
我使用的是雄辩的ORM,我想设置一个急切的加载来查询尽可能少的数据 我有三个表Php 如何使用即时加载来查询尽可能少的数据?,php,laravel,Php,Laravel,我使用的是雄辩的ORM,我想设置一个急切的加载来查询尽可能少的数据 我有三个表国家,州和城市,我想得到某个国家的所有州和城市,而不需要关于该国家的其他信息 我的模型: 国家 public function states () { return $this->hasMany(State::class); } 陈述 城市 例如,获取美国的所有州和城市。我希望得到如下数据 [ { id: 1, name: 'California',
国家
,州
和城市
,我想得到某个国家的所有州和城市,而不需要关于该国家的其他信息
我的模型:
国家
public function states () {
return $this->hasMany(State::class);
}
陈述
城市
例如,获取美国的所有州和城市。我希望得到如下数据
[
{
id: 1,
name: 'California',
cities: [
{
id: 1,
name: 'Los Angeles'
}
]
}
]
如何仅使用雄辩的ORM帮助程序而不使用
where
或原始SQL来实现这一点?您可以这样限制列:
Country::with('states:id,name,country_id', 'states.cities:id,name,state_id')->get(['id']);
您必须选择外键列,因为它们是匹配结果所必需的
您还可以将其集成到状态
关系中:
public function states () {
return $this->hasMany(State::class)->select('id', 'name', 'country_id')
->with('cities:id,name,state_id');
}
当您访问/加载州时,这将自动加载城市
,您可以:
$data = Country::with([
'states' => function ($query) {
$query->with([
'cities'
]);
}
])->get(['id']);
这更具可读性且不需要原始查询您是否已经定义了模型及其关系?你能把它们添加到问题中吗?我刚刚编辑过。检查一下!你能就答案给出反馈吗?@jonas staudenmeir我在等待使用雄辩关系的答案(Lightning\Database\Eloquent\Relations
)。我认为我得到的答案并不令人满意。也许我需要修改我的问题…你是什么意思?这两个答案都使用了雄辩的关系。指定外键是不必要的,至少官方的Laravel docs->`在使用此功能(急切加载特定列)时,您应该始终在希望检索的列列表中包含id列。`lara docs->这是必要的。在文档示例中,id
是外键。在这种情况下,states.id
、country\u id
和state\u id
是所需的外键。在文档示例中,id
是author表的主键,而不是外键:/文档中的句子措词不当,它只指以下的关系。在本例中,我们有两个具有许多关系。请在没有国家id
或州id
的情况下尝试我的答案,它将不起作用。我扩展了我的答案。
public function states () {
return $this->hasMany(State::class)->select('id', 'name', 'country_id')
->with('cities:id,name,state_id');
}
$data = Country::with([
'states' => function ($query) {
$query->with([
'cities'
]);
}
])->get(['id']);