2015-06-06 1 views
2

У меня есть две таблицы (и соответствующие модели) следующим образом:Как использовать LIMIT запрос на основе предложения ORDER BY в красноречивых

posts (
    id   auto_increment, 
    category_id refrences_id_on_categories, 
    data   json 
    date   timestamp 
) 

и

categories (
    id   auto_increment, 
    name   text 
) 

я мог бы получить 5 сообщений с помощью:

Post::orderBy('category_id', 'asc')->take(5)->get(); 

Но, есть ли способ, чтобы получить 5 сообщений каждого Category с использованием Eloquent (Laravel 5, dbms: postgres)?

Редактировать Я ищу решение по одной линии, например, используя GROUP BY или другие статьи.

ответ

0

на основе this answer, я использовал необработанные запросы, используя DB::select() следующим образом:

$sql = "SELECT * FROM (
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date DESC) AS r, 
    t.* 
    FROM 
    posts t) x full outer join categories t2 
    on x.category_id = t2.id 
WHERE 
    x.r <= 5"; 

DB::select($sql); 
0

Если настроить one-to-many связь между вами Category и Post моделей, вы можете использовать, чтобы получить 5 сообщений для каждой категории так:

$categories = Category::all(); 

foreach ($categories as $category) 
{ 
    $posts = $category->posts()->take(5)->get(); 
} 

Соотношение в вашей Category модели будет выглядеть следующим образом:

class Category extends Model { 

    public function posts() 
    { 
     return $this->hasMany('App\Post'); 
    } 

} 
+0

Спасибо, но я ищу решение в одной строке с помощью 'GROUP BY' или что-то еще. –

+0

Использование команды GROUP BY возвращает одну строку для сгруппированного столбца, поэтому вы не получите то, что вам нужно (что я предполагаю, это вложенный массив результатов для каждой категории). Не могли бы вы объяснить, почему вы увлекаетесь этим, возможно, объясните, как вы думаете, что сможете сделать это без Eloquent (имейте в виду, что не все решения проблемы могут быть одним лайнером, если это кажется более элегантным , а также Eloquent имеет свои ограничения). – Bogdan

+0

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

1

Вы можете использовать Eager Loading уменьшить свои запросы:

$categories = Category::with('posts')->get(); 

foreach ($categories as $category) 
{ 
    $posts = $category->posts()->take(5)->get(); 
} 
+1

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

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