如何使用预先加载来尽可能少地查询数据?

时间:2018-06-09 01:14:34

标签: php laravel

我正在使用Eloquent ORM,我希望设置一个急切的加载来查询尽可能少的数据。

我有三个表countriesstatescities,我希望获得某个国家/地区的所有州和城市,而无需有关该国家/地区的其他信息。< / 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?

2 个答案:

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

这更具可读性,不需要原始查询