我有一个查询,该查询按便利条件选择一些关系和组以删除重复的便利条件。但是现在,当我想在房间中加载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
无法正常工作,在这种情况下会给我一个错误。因此,我需要一个解决方案来让我适应所有列出的关系。
答案 0 :(得分:2)
在寻找具有某些相关模型的所有住宿时,实际上应该从Accommodation
模型中进行选择。对于前三个关系,这是开箱即用的,但是对于discount
关系,需要进行一些调整。最简单的解决方案是在HasManyThrough
模型上创建Accommodation
关系:
class Accommodation extends Model
{
public function discounts()
{
return $this->hasManyThrough(Discount::class, AccommodationRoom::class);
}
}
注意:这希望您的模型使用按惯例命名的外键列;对于不同的名称,您需要将自定义外键名称作为附加参数according to the documentation传递。
建立此关系后,您可以使用如下查询:
$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
,一个Comment
可以有许多Like
:
has many has many
Post -----------------> Comment -----------------> Like
1 n 1 n
在这种情况下,我们还知道一个Post
可以有多个Like
。这正是我们在使用HasManyThrough
时所利用的知识。我们只是简单地告诉Eloquent,Post
有许多Like
,它们之间由Post
连接:
has many has many
Post -----------------> Comment -----------------> Like
1 n 1 n
has many through Comment
Post ------------------------------------------------> Like
1 n