Laravel возвращает красноречивый результат, где он соответствует всем идентификаторам, а не просто паре - PullRequest
0 голосов
/ 30 октября 2018

Я почему-то не могу обернуть голову вокруг этого, хотя кажется, что ответ прямо передо мной.

У меня есть 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());
}

Остальная часть строителя работает нормально.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы должны выбрать арендные платы, в которых количество идентификаторов удобств совпадает с размером массива удобств, исходя из вашего запроса, сгруппировав арендные платы по количеству удобств.

Вот пример:

$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();
0 голосов
/ 30 октября 2018

Как предложил Камаль Паливал, определите 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();
0 голосов
/ 30 октября 2018

Вы должны создать множество отношений между арендой и удобствами, как показано ниже:

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);
})

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...