Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Пишу фильтр, который бы соритировал жилые комплексы по минимальной и максимальной цене квартиры находящийся в нём.
Дано:
Есть таблица с домами. = houses
id, name
Есть таблица с квартирами = flats
id, house_id, price
Как пример нужно составить два запроса для фильтра:
1. Отфильтровать дома по цене квартир в порядке возрастания \ убывания.
2. Найти все дома, у которых цена квартир начинается "от", либо "до".
Идеально понять как это сделать на Моделях Eloquent, если используется Laravel
Не в сети
1. Не совсем полностью Eloquent, но можно так:
House::leftJoin('flats', 'houses.id', '=', 'flats.house_id')->orderBy('flats.price', 'desc')->get()
2. Используй whereHas():
House::whereHas('flats', function ($q) use ($from, $to) {
$q->whereBetween('price', [$from, $to]);
})->get()
Изменено AlexeyMezenin (01.06.2017 18:59:06)
Не в сети
На сколько я понимаю, первый способ в реальной таблице еще перегрузит параметры например если в обеих таблицах будет столбец image и так же полетят все отношения, что не совсем подходит. А второй не будет работать с первым.
Не в сети
По поводу работы вместе, ты ведь просил два запроса...
А вообще, не вижу причин, по которым запросы не будут работать вместе.
Изменено AlexeyMezenin (01.06.2017 21:41:50)
Не в сети
оба запроса будут проще и быстрее если пересчитывать максимальную и минимальную стоимость на событиях модели Flat и «кэшировать» её в дополнительных полях модели House.
и я не устаю повторять это – не используйте джойны и группировки на моделях, особенно на отношениях один-ко-многим и многие-ко-многим, это нарушает принцип «одна запись из базы – один объект модели» и приводит к очень странным глюкам. если нужны связанные записи – их надо запрашивать либо средствами элоквента, либо если таких не существует – через построитель запросов. ну или поменять структуру базы под условия задачи – как в моём варианте решения для (1).
Не в сети