Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 01.06.2017 18:05:06

Как написать запрос на минимальную цену дочерних элементов?

Пишу фильтр, который бы соритировал жилые комплексы по минимальной и максимальной цене квартиры находящийся в нём.

Дано:
Есть таблица с домами. = houses
id, name

Есть таблица с квартирами = flats
id, house_id, price

Как пример нужно составить два запроса для фильтра:
1. Отфильтровать дома по цене квартир в порядке возрастания \ убывания.
2. Найти все дома, у которых цена квартир начинается "от", либо "до".

Идеально понять как это сделать на Моделях Eloquent, если используется Laravel

Не в сети

#2 01.06.2017 18:56:50

Re: Как написать запрос на минимальную цену дочерних элементов?

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)

Не в сети

#3 01.06.2017 20:51:08

Re: Как написать запрос на минимальную цену дочерних элементов?

На сколько я понимаю, первый способ в реальной таблице еще перегрузит параметры например если в обеих таблицах будет столбец image и так же полетят все отношения, что не совсем подходит. А второй не будет работать с первым.

Не в сети

#4 01.06.2017 21:39:22

Re: Как написать запрос на минимальную цену дочерних элементов?

По поводу работы вместе, ты ведь просил два запроса...

А вообще, не вижу причин, по которым запросы не будут работать вместе.

Изменено AlexeyMezenin (01.06.2017 21:41:50)

Не в сети

#5 02.06.2017 05:35:53

Re: Как написать запрос на минимальную цену дочерних элементов?

оба запроса будут проще и быстрее если пересчитывать максимальную и минимальную стоимость на событиях модели Flat и «кэшировать» её в дополнительных полях модели House.

и я не устаю повторять это – не используйте джойны и группировки на моделях, особенно на отношениях один-ко-многим и многие-ко-многим, это нарушает принцип «одна запись из базы – один объект модели» и приводит к очень странным глюкам. если нужны связанные записи – их надо запрашивать либо средствами элоквента, либо если таких не существует – через построитель запросов. ну или поменять структуру базы под условия задачи – как в моём варианте решения для (1).

Не в сети

Подвал раздела