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 为 Yajra DataTables 编写连接查询的慢 MySQL