Как вывести одновременно все посты и конкретный? Laravel
Мой Controller:
public function post($code, $id){
$specpost = Post::where('id', $id)->get();
return view('post', compact('specpost'));
}
Это способ, с помощью которого я получаю конкретный пост, выбранный пользователем. Но так же я хочу предлагать рандомно пользователю почитать какой либо другой пост. Как грамотно можно вывести другие посты? Просто взять и второй выборкой написать $rand = Post::where('id', '<>', $id)->inRandomOrder()->limit(10)->get(); почему то мне кажется не совсем корректным. К тому же слышал, что если писать 2 выборки из одного контроллера, то он будет перегружен. Если другой способ это сделать? Например как-нибудь через eloquent связи и т.д.?
Спасибо!
Ответы (1 шт):
public function post($code, $id){
$specpost = Post::find($id);
// получаем кол-во всех постов
$postsCount = Post::count();
// определяем массив рандомных чисел
$suggestPostsIds = [];
// циклом добавляем рандомное число в массив. Будет выполнено 150 попыток подобрать уникальный ID.
for ($i = 0; $i < 150; $i++) {
$num = rand(1, $postsCount); // от 1 до последнего поста
// прерываем цикл, если в массиве уже достаточное кол-во ID
if (count($suggestPostsIds) === 4) break;
// проверяем, не повторяется ли число? если нет, добавляем в массив
if (!in_array($num, $suggestPostsIds)) {
array_push($suggestPostsIds, $num);
}
}
// получаем посты по рандомным ID
$suggestPosts = Post::whereIn('id', $suggestPostsIds)->get();
// осталось передать во вью
return view('post', compact('specpost'));
}
Обращений к базе данных должно быть столько, сколько нужно данных для работы приложения, на то она и база данных. 30-50-100 запросов к БД это норма.