【问题标题】:Laravel Eloquent match to all parameters of joinLaravel Eloquent 匹配连接的所有参数
【发布时间】: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() 的调用,这让我相信我需要在该模型中建立关系?

标签: laravel eloquent laravel-7


【解决方案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

【讨论】:

  • 我将对此进行更多研究,我需要解决这个问题,另一个答案是更快的方法,但我喜欢这种方法。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2019-09-06
  • 2023-03-07
相关资源
最近更新 更多