2017-06-15 91 views
2

考虑Laravel指南中有许多Through关系的基本示例,我试图直接使用具有类型100(仅作为示例)的帖子的雄辩的国家进行查询。查询HasManyThrough Laravel关系检索相关记录

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在帖子是我的特殊情况..

所以,我创建了创建通过用户帖子的关系全国模型的关系。我想要达到的结果是国家名单,并在每个国家内列出该国用户创建的职位。

//Country.php 
public function posts() 
{ 
    return $this->hasManyThrough(
     'Post', 'User', 'country_id', 'user_id' 
    ); 
} 

我能复制我想以其他方式实现的结果,但我想知道为什么下面的雄辩查询不返回预期的结果:

$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; 
}); 

而且我已经alread Ÿ在负载内尝试使用封闭的地方。但它也没有工作。结果是一样的。

回答

2

您必须使用withwhereHas作为查询。 whereHas将约束Country查询以仅显示具有来自指定ID的帖子的国家,但不会在结果中加载这些帖子。 with()然后会急于加载结果中的posts BUT,因为它在第一个查询执行后被调用,它不知道约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(); 
1

你渴望加载每个国家的所有帖子,这就是为什么你看到他们。我会尝试修改查询到这:

$postsGroupedByCountries = Country::whereHas('posts', function ($query) { 
    $query->where('type_id', 100) 
})->get(); 

看看你得到什么回报。

+0

但我想提供加载的数据发布。 WhereHas会做到这一点?我认为whereHas只是有条件的。 –

+0

我认为它会返回你加载的帖子,试一试,看看结果是什么。我一直在引用这篇文章,顺便说一句:https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean – btl

+0

帖子未加载。我想这与哪里有延迟加载。我需要在雄辩的查询之后做一个foreach,然后调用$ country-> posts来获取它并放到国内。 –