2016-12-19 7 views
0

У меня есть следующие цены стол:Новые элементы и GROUP По выразительными

shop_id (int) 
product_id (int) 
price (float) 
created (DateTime) 

Каждый час cronjob проверяет магазины и вставляет новые записи (в текущих ценах) в эти прайс-таблицу.

Теперь я хочу показать новейшую цену продукта. У меня есть GROUP BY shop_id, потому что мне нужна только одна цена за магазин, но я хочу только самую новую запись (созданную).

Могу ли я решить эту проблему с помощью Eloquent Query-Builder или мне нужно использовать необработанный SQL? Возможно ли передать результат исходного SQL-запроса в модель, если столбцы одинаковы?

ответ

0

Я решил проблему без QueryBuilder. Вместо этого я использую необработанный SQL-оператор и создаю модели с функцией hydrateRaw() класса Model.

$prices = Price::hydrateRaw('SELECT p.* 
     FROM prices p 
     INNER JOIN (
     SELECT shop_id, max(created_at) AS max_ca 
     FROM prices p1 
     GROUP BY shop_id 
    ) m ON p.shop_id = m.shop_id AND p.created_at = m.max_ca'); 
1

Вы можете попробовать, как:

Price::select('*', DB::raw('MAX(created_at) as max_created_at')) 
     ->groupBy('shop_id') 
     ->get() 

Предполагая, что название модели является Price

+0

SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 1055 'xyz.prices.id' не в GROUP BY (SQL:. Выберите 'prices' *, MAX (created_at) в max_created_at от' цен 'group by' shop_id') – rakete

+0

Эта ошибка связана с MySql. Вы можете проверить [это] (http://stackoverflow.com/questions/41199800/group-by-laravel/41200112#41200112) ответ для решения –

+0

Hi Amit! Я могу выполнить его сейчас без ошибок, но DB :: raw() никак не влияет на результат. Я могу удалить его, ничего не изменится. Результатом является первая строка магазина, независимо от created_at. Не хватает ли где() или что-то в этом роде, где я проверяю, что created_at равен max_created_at? – rakete

0

Eloquent (пуристом) подход:

Price::orderBy('created', 'desc')->groupBy('shop_id') 
           ->get('shop_id', 'price'); 

Ссылки:

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_orderBy

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_groupBy

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_get

* непроверенных хотя

Q: Можно ли передать результат исходного SQL-запроса в модели, если столбцы одинаковы?

A: вы можете передать его Model's contructor - но для этого может потребоваться заполнение поля модели - или hydrate a model. Кроме того, просто обращайтесь к нему, как к массиву с ключом, т.е. $something[0]['price'] < - предполагая массив цен с ценовой колонкой.

+0

Это не работает! – rakete

+0

@rakete, так что, какая-нибудь подсказка о том, с какой ошибкой вы столкнулись, или результат не так хорош, как вы ожидаете? –