与groupBy laravel的加载关系

时间:2019-09-08 08:38:18

标签: php laravel eloquent

我有一个查询,该查询按便利条件选择一些关系和组以删除重复的便利条件。但是现在,当我想在房间中加载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无法正常工作,在这种情况下会给我一个错误。因此,我需要一个解决方案来让我适应所有列出的关系。

1 个答案:

答案 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使用两个模型之间的第三个模型在两个模型之间建立虚拟关系。假设您有PostCommentLike作为模型。一个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