我已经阅读了几篇关于为什么热切加载使用多个查询而非加入here,here和here的帖子。但是,我认为有一种情况我认为使用连接而不是急切加载。我如何构造查询,以便我可以访问子对象,就好像它是一个通常渴望加载的对象一样?
示例:让居住在某条街道上的人员,并同时加载该地址。我不想加载所有人的地址,因为他住在很多地方;只是与查询匹配的地方。急切的加载和我必须复制查询的地方,并不总是这么简单的查询:
People::with(['address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
}])->whereHas('address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
})->get();
可能是
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
问题是我无法使用它:
$person->address
有没有办法接受并按摩它(使用选择?),以便它看起来像是急切加载?
答案 0 :(得分:3)
您可以执行以下操作:
People::join('addresses', 'addresses.people_id', '=', 'people.id')
->selectRaw('people.*')
->where('street_name', $street_name)
->with('addresses')
->get();
这使用加入和急切加载。
仅使用连接,您可以访问以下内容:
$person->street_address