2015-11-20 5 views
1

У меня есть следующие таблицы:Laravel: Сортировать по первой (самой старой) записи hasMany отношения в

PRODUCTS id | title -- | --------------- 1 | First Product 2 | Second Product 3 | Third Product

PRODUCT_VERSIONS id | product_id | release_date -- | ---------- | ------------ 1 | 1 | 2013-01-01 2 | 1 | 2014-01-01 3 | 1 | 2015-03-01 4 | 2 | 2013-02-02 5 | 2 | 2014-02-02 6 | 2 | 2015-02-02 7 | 3 | 2013-03-03 8 | 3 | 2014-03-03 9 | 3 | 2015-03-03


Отношения

Product-> hasMany ("ProductVersion")

ProductVersion-> принадлежит к категории («Продукт»)


Что я хочу сделать, это выбрать все товары и заказать по первой (самой старой) product_version.release_date.

Или, может быть, лучше отсортировать product_versions по адресу release_date, group by addon_id, а затем присоединиться к таблице продуктов?

Я искал и искал решение, и у меня есть несколько запросов, которые почти работают. Мне интересно, есть ли простой способ (ish) сделать это с Laravel.

+0

Я думаю, что [это] (http://stackoverflow.com/questions/18143061/laravel-orderby-on-a-relationship) может быть тем, что вы ищете. Ознакомьтесь с комментариями. – Andrew

+0

Возможный дубликат [Laravel order by hasmany relationship] (http://stackoverflow.com/questions/28634921/laravel-order-by-hasmany-relationship) – patricus

ответ

0

Вы можете использовать для этого соединения. Соедините две таблицы, сгруппировать их по идентификатору, заказ по последней дате, которую я с псевдонимом «latest_release_date»:

$products = Product::selectRaw('products.*, MAX(product_versions.release_date) as latest_release_date') 
    ->leftJoin('product_versions', 'product_versions.product_id', '=', 'products.id') 
    ->orderBy('latest_release_date', 'DESC') 
    ->groupBy('products.id') 
    ->get(); 

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

Смежные вопросы