Как вывести одновременно все посты и конкретный? 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 шт):

Автор решения: Daniil Kedrov
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 запросов к БД это норма.

→ Ссылка