Laravel返回雄辩的结果,它匹配所有ID,而不仅仅是一对

时间:2018-10-30 17:09:30

标签: laravel eloquent laravel-5.7

出于某种原因,我似乎无法解决这个问题,即使答案似乎就在我眼前。

我有3个表,rentalsamenitiesamenities_rentals

便利设施包括空调,员工等。

amenities_rentals具有rentail_idamenities_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());
}

其余的构建器工作正常。

3 个答案:

答案 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();