Laravel Eloquent 匹配连接的所有参数

Posted

技术标签:

【中文标题】Laravel Eloquent 匹配连接的所有参数【英文标题】:Laravel Eloquent match to all parameters of join 【发布时间】:2021-12-23 05:45:33 【问题描述】:

我有一张桌子,里面有酒店 ID 和设施 ID。当用户选择设施时,我只需要拉出拥有所有所选设施的酒店。截至目前,它让我拥有至少拥有一家的所有酒店。如何更改此构建器查询以处理它,使其不包括没有全部的酒店。

$builder = Hotels::query(); 
$builder->select('hotels.id','hotels'.'hotels_name')
$request_amenities = $request->amenities;
$builder->join('amenities_hotels', function ($join) use($request_amenities) 
    $join->on('amenities_hotels.hotel_id', '=', 'hotel.id')
            ->whereIn('amenities_hotels.amenities_id', $request_amenities);
);

【问题讨论】:

在不知道$builder 是什么的情况下很难说。不过你可以看看whereHas builder 是查询构建器。开始像 $builder = Hotels::query(); $builder->select('hotels.id','hotels'.'hotels_name') 这会给你想要的结果吗? $hotels = Hotel::select(['id','hotels_name'])->whereHas('amenities', function($query) use($request)return $query->whereIn('id', $request->amenities);)->get()?将此添加为评论,因为我不知道关系、表或列的相关名称。 我收到对未定义方法 App\Hotels::AmenitiesHotel() 的调用,这让我相信我需要在该模型中建立关系? 【参考方案1】:

类似于WhereAll 你需要...

您必须为数组中的每个项目添加whereHas

 $builder = Hotels::query();
        $builder->select('hotels.id', 'hotels' . 'hotels_name');
        $request_amenities = $request->amenities;
        if($request_amenities!=null)
        
            for ($i = 0; $i < $this->count($request_amenities); $i++) 
                $builder = $builder->whereHas('amenitiesHotels', function ($query) use ($i, $request_amenities) 
                    $query->where('amenities_hotels.amenities_id', $request_amenities[$i]);
                );
        

在question中查看更多信息

【讨论】:

我选择了这个的变体。感谢您的帮助。【参考方案2】:

酒店模型。

// ...

    public function amenities(): BelongsToMany
    
        return $this->belongsToMany(
            Amenities::class,
            "amenities_hotels"
        );
    

//  ...

要运行的查询。

Hotels::select(['hotels.id','hotels'.'hotels_name'])

->whereHas('amenities', function ($query, $request_amenities) 

    $query->whereIn('amenities.id', $request_amenities);

, '=', count($request_amenities))->get();

上面的查询告诉 Laravel 在 amenities 时加载具有 count($request_amenities) amenities 关系记录的酒店> 关系记录由给定的 ID 数组过滤。

资源:"Where Has All" Functionality in Laravel

【讨论】:

我将对此进行更多研究,我需要解决这个问题,另一个答案是更快的方法,但我喜欢这种方法。感谢您的帮助。

以上是关于Laravel Eloquent 匹配连接的所有参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel Eloquent 中连接表值

用 Laravel/Eloquent 为 Yajra DataTables 编写连接查询的慢 MySQL

使用 Eloquent 模型的数据类型不匹配

查询 Laravel Eloquent 多对多,其中所有 id 都相等

Laravel - Eloquent 连接

Laravel 带计数的多重连接(不是 Eloquent)