[英]Query HasManyThrough Laravel relation retrieving related records
考慮到 Laravel 指南中的基本示例 Has Many Through 關系,我嘗試使用 eloquent 直接查詢,這些國家的帖子來自類型 100(只是一個示例)。
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
posts
id - integer
user_id - integer
title - string
type_id - integer
帖子中的 type_id 是我的特殊情況..
因此,我在國家 model 中創建了一個關系,該關系通過用戶創建了與帖子的關系。 我想要實現的結果是一個國家列表以及每個國家/地區內該國家/地區用戶創建的帖子。
//Country.php
public function posts()
{
return $this->hasManyThrough(
'Post', 'User', 'country_id', 'user_id'
);
}
我能夠以其他方式復制我想要實現的結果,但我想知道為什么下面的 eloquent 查詢沒有返回預期的結果:
$postsGroupedByCountries = Country::with([
'posts' => function ($query) {
$query->where('type_id', 100);
}
])->get();
查詢的返回是幾個國家,所有帖子都沒有數據。 使用 Laravel Eloquent 執行此查詢的正確方法是什么?
第一次嘗試:
$postsGroupedByCountries = Country::whereHas('posts', function ($query) {
$query->where('type_id', 100);
})->get();
第二次嘗試:
$postsGroupedByCountries = Country::whereHas('posts', function ($query) {
$query->where('type_id', 100)->groupBy('posts.id');
})->get();
第三次嘗試:
$postsGroupedByCountries = Country::whereHas('posts', function ($query) {
$query->where('type_id', 100);
})->get();
$postsGroupedByCountries = $postsGroupedByCountries ->map(function($country){
$country->load('posts');
return $country;
});
而且我已經嘗試在負載內部也使用帶有 where 的閉包。 但它也沒有奏效。 結果是一樣的。
您必須使用with
和whereHas
進行查詢。 whereHas
將限制Country
查詢僅顯示具有指定id的帖子的國家,但不會在結果中加載這些帖子。 然后with()
會急切加載結果中的posts
但因為它在第一個查詢執行后調用它不知道whereHas
約束,並且由於它沒有傳遞任何約束,它將加載每個國家的所有帖子。 要使用相同的約束加載Country
的帖子,您還需要將其傳遞給with
方法。
所有放在一起看起來像:
$countries = Country::whereHas('posts', function($query) {
return $query->where('type_id', 100);
})
->with(['posts' => function($query) {
return $query->where('type_id', 100);
}])
->get();
你渴望加載每個國家的所有帖子,這就是你看到它們的原因。 我會嘗試將查詢修改為:
$postsGroupedByCountries = Country::whereHas('posts', function ($query) {
$query->where('type_id', 100)
})->get();
看看你得到了什么。
// Country.php
public function postsOfTypeHundred()
{
return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id')
->where('type_id', 100);
}
/**
* Laravel ^9.15
* In Controller
*/
$countries = Country::withWhereHas('postsOfTypeHundred')->get();
/** Created By */
$countries[0]->posts[0]->user->name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.