Вы не можете этого сделать в Eloquent. По сути вы достаете только 3 категории. Поэтому, если товаров не много можете выбрать категории, а затем сделать map по коллекции и убрать ненужные товары. Либо можете сделать что-то типа:
Я что-то не так делаю или пример с latestProducts формирует точно такой же запрос, что и изначальный (который ограничивает все записи, а не количество под каждую модель)?
public function limitRoles()
{
return $this->hasMany(ProjectUserRole::class, "project_id")->take(3);
}
В обработчике:
Route::get("test", function () {
$result = \App\Models\Project::with("limitRoles")->get();
dump($result);
});
Запросы через DebugBar:
1. select * from `projects`
2. select * from `projects_users_roles` where `projects_users_roles`.`project_id` in ('2', '3', '4', '18', '21') limit 3
То же самое, что и при:
$result = \App\Models\Project::with(["roles" => function($query){
$query->take(3);
}])->get();
Виктор: В таком случае, нужно либо обрезать коллекцию, либо делать запросы не через lazy-load. По-другому eloquent не умеет, я удалю это из ответа. Насколько я знаю, через sql запрос сделать это очень сложно, и подсказать в запросе я не смогу. Прошу прощения.