Вот как бывает, 2 решения и в обоих люди не знают как работат жадная загрузка... :)
Вот вам нормальное решение.
Чтоб взять последние 5 для каждой записи, у вас по любому надо делать отельный запрос на каждого Юзера. так БД работает, иначе очень сложный запрос получается типо такого.
$articles = `SELECT category, id, title FROM (
SELECT c.name AS category, a.id, a.title, row_number() OVER (PARTITION BY categoryid ORDER BY a.sort DESC) AS row
FROM articles a INNER JOIN categories c ON (a.categoryid=c.dboid)
ORDER BY c.sort
) AS foo WHERE row <= 5;
Поэтому, сперва получаете юзеров, а потом проходите по ним циклом и получаете все что относится к постам
foreach ($users as $user) {
user->load(['posts' => function($q){
$q->take(5);
}]);
}