出于某种原因,我似乎无法解决这个问题,即使答案似乎就在我眼前。
我有3个表,rentals
,amenities
和amenities_rentals
便利设施包括空调,员工等。
amenities_rentals
具有rentail_id
,amenities_id
。该表基本上是将rentals
连接到amenities
的参考表。
在搜索中,用户可以通过取消某些设施来缩小租金范围。截至目前,它为我提供了所有已出租的租赁选项,其中一项已被选中。我需要将其范围缩小到仅具有全部所选设施的租赁。这就是我所拥有的,这不仅是不正确地提取信息,而且我知道还有更好的方法。
if($request->has('amenities'))
{
$rental_ids = AmenitiesRentals::select('rental_id')
->whereIn('amenities_id',$request->amenities)
->distinct()
->get();
$builder->whereIn('rentals.id', $rental_ids->toArray());
}
其余的构建器工作正常。
答案 0 :(得分:0)
您应该在租金和设施之间建立很多联系,如下所示:
public function amenities()
{
return $this->belongsToMany(\AmenityModel::class, 'amenities_rentals', 'rental_id', 'amenities_id');
}
然后在应用过滤器时,您可以通过以下方式添加它:
$amenitiesIds = $request->amenities;
RentalsModel::with('amenities')->whereHas('amenities', function ($q) use ($amenitiesIds) {
$q->whereIn('amenities_id', $amenitiesIds);
})
希望这对您有所帮助。
答案 1 :(得分:0)
您应该通过按设施计数对租赁进行分组,从您的请求中选择设施ID计数与设施阵列大小相同的租赁。
这里是一个例子:
$amenities_ids = $request->amenities;
$amenities_ids_count = count($amenities_ids);
$rental_ids = AmenitiesRentals::selectRaw("COUNT(amenities_id) as amenities_count, rentail_id")
->whereIn('amenities_id', $amenities_ids)
->groupBy('rentail_id')
->having('amenities_count', $amenities_ids_count)
->get();
答案 2 :(得分:0)
根据Kamal Paliwal的建议,在您的BelongsToMany
模型中定义一个Rental
关系:
public function amenities() {
return $this->belongsToMany(Amenity::class, 'amenities_rentals', 'rental_id', 'amenities_id');
}
然后使用whereHas()
:
$amenities = $request->amenities;
$rentals = Rental::whereHas('amenities', function ($query) use ($amenities) {
$query->whereIn('amenities.id', $amenities);
}, '=', count($amenities))->get();