php - 加载与 groupBy laravel 的关系
问题描述
我有一个查询,它通过住宿选择一些关系和组以删除重复的住宿。但是现在当我想discount
在房间上加载房地产时,它不起作用,因为我只选择了accommodation_id
.
这是我的代码:
$data = AccommodationRoom::with('accommodation.city', 'accommodation.accommodationFacilities', 'accommodation.gallery','discount')
->select('accommodation_id')
->whereHas('roomCapacityHistory', function ($query) use ($from_date, $to_date) {
$query->whereDate('from_date', '<=', $from_date);
$query->whereDate('to_date', '>=', $to_date);
})
->whereHas('accommodation', function ($query) use ($searchCity) {
$query->where('city_id', $searchCity);
})
->groupBy('accommodation_id')
->get();
现在,如果我将其添加id
到选择中会很好,但我的groupBy
不起作用并在这种情况下给我一个错误。所以我需要一个解决方案来获得我所有与列出的关系的住宿。
解决方案
当您正在寻找具有某些相关模型的所有住宿时,您实际上应该从您的Accommodation
模型中进行选择。对于前三个关系,这将是开箱即用的,但需要对discount
关系进行一些调整。最简单的解决方案是在模型上创建一个HasManyThrough
关系Accommodation
:
class Accommodation extends Model
{
public function discounts()
{
return $this->hasManyThrough(Discount::class, AccommodationRoom::class);
}
}
注意:这期望您的模型使用按约定命名的外键列;对于不同的名称,您需要根据文档将自定义外键名称作为附加参数传递。
建立此关系后,您可以使用如下查询:
$data = Accommodation::with('city', 'accommodationFacilities', 'gallery', 'discounts')
->whereHas('accommodationRooms.roomCapacityHistory', function ($query) use ($from_date, $to_date) {
$query->whereDate('from_date', '<=', $from_date);
$query->whereDate('to_date', '>=', $to_date);
})
->where('city_id', $searchCity)
->get();
评论中要求的进一步解释:
HasManyThrough
使用中间的第三个模型在两个模型之间建立虚拟关系。想象一下你有Post
,Comment
并且Like
作为模型。一个Post
可以有多个Comment
s,一个Comment
可以有多个Like
s:
has many has many
Post -----------------> Comment -----------------> Like
1 n 1 n
在这种情况下,我们也知道一个Post
可以有多个Like
s。而这正是我们在使用HasManyThrough
. 我们简单地告诉 Eloquent,aPost
有很多Like
s,由它们之间的Post
s 连接:
has many has many
Post -----------------> Comment -----------------> Like
1 n 1 n
has many through Comment
Post ------------------------------------------------> Like
1 n
推荐阅读
- json - 如何从 Json api 制作动态侧边栏?
- xamarin - 如何使本地 ContentView 绑定标签文本
- c++ - 依赖于模板参数类型的静态 constexpr 类成员的初始化
- regex - Oracle:特殊字符过滤器几乎没有例外
- javascript - Express Next() return 404 not found
- javascript - 将变量定义为 let 和 var 显示 NaN
- react-native - 我怎样才能让我以前的 TextInput 值留在盒子里反应原生?
- angular - 在 Firebase (Angular) 中对数据进行排序
- angular - 角度打字稿:分配后变量内容未定义
- amazon-web-services - 在无响应系统的情况下自动启动/停止 AWS 实例