我可以使用 join 来伪造 laravel 预加载吗?

whi*_*ok6 2 join eager-loading laravel

我读过几篇关于为什么急切加载使用多个查询而不是加入此处此处此处的文章。但是,我认为有必要使用联接而不是急切加载。我将如何构造查询,以便可以访问子对象,就好像它是通常急切加载的对象一样?

示例:获取居住在某条街道上的人员,并同时加载该地址。我不想加载这个人的所有地址,因为他住在很多地方;仅匹配查询的位置。通过急切加载和 whereHas,我必须重复查询,而且查询并不总是这么简单:

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();
Run Code Online (Sandbox Code Playgroud)

可能

People::query()->join('address', function($join){
  $join->on(...)
})->where('street_name', $street_name);
Run Code Online (Sandbox Code Playgroud)

那么问题是我不能使用这个:

$person->address
Run Code Online (Sandbox Code Playgroud)

有没有办法接受连接并对其进行按摩(使用选择?),使其看起来像是急切加载的?

小智 5

您可以执行以下操作:

People::join('addresses', 'addresses.people_id', '=', 'people.id')
->selectRaw('people.*')
->where('street_name', $street_name)
->with('addresses')
->get();
Run Code Online (Sandbox Code Playgroud)

这使用了连接和预加载。

仅通过连接,您就可以访问以下内容:

$person->street_address
Run Code Online (Sandbox Code Playgroud)