Php 如何使用即时加载来查询尽可能少的数据?

Php 如何使用即时加载来查询尽可能少的数据?,php,laravel,Php,Laravel,我使用的是雄辩的ORM,我想设置一个急切的加载来查询尽可能少的数据 我有三个表国家,州和城市,我想得到某个国家的所有州和城市,而不需要关于该国家的其他信息 我的模型: 国家 public function states () { return $this->hasMany(State::class); } 陈述 城市 例如,获取美国的所有州和城市。我希望得到如下数据 [ { id: 1, name: 'California',

我使用的是雄辩的ORM,我想设置一个急切的加载来查询尽可能少的数据

我有三个表
国家
城市
,我想得到某个国家的所有州和城市,而不需要关于该国家的其他信息

我的模型:

国家

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']);