我可以使用连接伪造 laravel 预加载吗?
Can I fake laravel eager loading using a join?
我已经阅读了几篇关于为什么预加载使用多个查询而不是加入 here, here, and here 的帖子。但是,我认为有必要使用连接而不是急切加载。我将如何构建查询,以便我可以访问子对象,就好像它是一个通常急切加载的对象一样?
示例:获取住在某条街道上的人,并同时加载该地址。我不想加载这个人的所有地址,以防他住在很多地方;只是匹配查询的地方。使用预加载和 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();
可能是
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
问题是我不能使用这个:
$person->address
有没有办法获取连接并对其进行修改(使用选择?),使其看起来像是急切加载的?
您可以执行以下操作:
People::join('addresses', 'addresses.people_id', '=', 'people.id')
->selectRaw('people.*')
->where('street_name', $street_name)
->with('addresses')
->get();
这使用了连接和预先加载。
仅通过连接,您可以访问以下内容:
$person->street_address
我已经阅读了几篇关于为什么预加载使用多个查询而不是加入 here, here, and here 的帖子。但是,我认为有必要使用连接而不是急切加载。我将如何构建查询,以便我可以访问子对象,就好像它是一个通常急切加载的对象一样?
示例:获取住在某条街道上的人,并同时加载该地址。我不想加载这个人的所有地址,以防他住在很多地方;只是匹配查询的地方。使用预加载和 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();
可能是
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
问题是我不能使用这个:
$person->address
有没有办法获取连接并对其进行修改(使用选择?),使其看起来像是急切加载的?
您可以执行以下操作:
People::join('addresses', 'addresses.people_id', '=', 'people.id')
->selectRaw('people.*')
->where('street_name', $street_name)
->with('addresses')
->get();
这使用了连接和预先加载。
仅通过连接,您可以访问以下内容:
$person->street_address