簡體   English   中英

查詢 HasManyThrough Laravel 關系檢索相關記錄

[英]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 的閉包。 但它也沒有奏效。 結果是一樣的。

您必須使用withwhereHas進行查詢。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM