首页 > 解决方案 > 加载与 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不起作用并在这种情况下给我一个错误。所以我需要一个解决方案来获得我所有与列出的关系的住宿。

标签: phplaraveleloquent

解决方案


当您正在寻找具有某些相关模型的所有住宿时,您实际上应该从您的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可以有多个Comments,一个Comment可以有多个Likes:

            has many                       has many
Post   ----------------->   Comment   ----------------->   Like
       1                n             1                n

在这种情况下,我们也知道一个Post可以有多个Likes。而这正是我们在使用HasManyThrough. 我们简单地告诉 Eloquent,aPost有很多Likes,由它们之间的Posts 连接:

            has many                       has many
Post   ----------------->   Comment   ----------------->   Like
       1                n             1                n


                   has many through Comment
Post   ------------------------------------------------>   Like
       1                                               n

推荐阅读