【发布时间】:2017-11-18 14:28:34
【问题描述】:
考虑到 Laravel 指南中的基本示例 Has Many Through 关系,我尝试直接查询具有 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
posts 中的 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;
});
而且我已经尝试在负载内部使用带有 where 的闭包。但它也没有奏效。结果是一样的。
【问题讨论】: