Запросите 5 лучших категорий с наибольшим содержанием, верните 5 содержимого из каждой категории и объедините ассоциированное имя пользователя с содержимым с помощью laravel - PullRequest
0 голосов
/ 20 февраля 2019

Я очень новичок в Laravel, и мне тяжело с этим ...

У меня есть 3 таблицы

Категория:

id,
name,
...;

видео:

id,
category_id,
user_id,
..;

Пользователь:

id 

в модели категории я создал связь с видео:

public function video()
{
    return $this->hasMany('App\Video')->where('isLive', 1);
}

А в модели видео отношение относится к категории

public function category()
{
    return $this->belongsTo('App\Category');
}

в контроллере категорий я получаю свои данные, выполняя следующий запрос

 public function index()
{
    $data = \App\Category::where('is_active', 1)
                ->with('video')
                ->paginate(15);
}

Моя основная проблема заключается в том, как объединить имя пользователя каждого видео с результатом

второстепенная проблема - получение 5 лучших категорий с большинством видео

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Не самый красивый запрос, который я написал, но вы можете сделать это с помощью SQL, причина использования IN (подзапрос (subquery ())) заключается в возможности использовать LIMIT

SELECT
    b.*,
    u.username
FROM
    (
        (SELECT video.* FROM video
        WHERE video.category_id IN(
                SELECT a.category_id
                FROM
                    (
                        SELECT category_id FROM video GROUP BY category_id ORDER BY count(*) DESC LIMIT 1
                    ) as a
            )
        LIMIT 5)
        UNION (SELECT video.* FROM video 
        WHERE video.category_id IN(
                SELECT a.category_id
                FROM
                    (
                        SELECT category_id FROM video GROUP BY category_id ORDER BY count(*) DESC LIMIT 1,1
                    ) as a
            )
        LIMIT 5)
        UNION (SELECT video.* FROM video 
        WHERE video.category_id IN(
                SELECT a.category_id
                FROM
                    (
                        SELECT category_id FROM video GROUP BY category_id ORDER BY count(*) DESC LIMIT 2,1
                    ) as a
            )
        LIMIT 5)
        UNION (SELECT video.* FROM video 
        WHERE video.category_id IN(
                SELECT a.category_id
                FROM
                    (
                        SELECT category_id FROM video GROUP BY category_id ORDER BY count(*) DESC LIMIT 3,1
                    ) as a
            )
        LIMIT 5)
        UNION (SELECT video.* FROM video 
        WHERE video.category_id IN(
                SELECT a.category_id
                FROM
                    (
                        SELECT category_id FROM video GROUP BY category_id ORDER BY count(*) DESC LIMIT 4,1
                    ) as a
            )
        LIMIT 5)
    ) as b
JOIN user u ON
    u.id = b.user_id

После этого я думаю, что вы делаете что-то вроде этого в laravel:

$videos = DB::select($aboveQuery);
0 голосов
/ 20 февраля 2019

Чтобы получить Топ 5 категорий, в которых больше всего видео:

$top5Cat = Category::withCount('video')->orderBy('video_count', 'desc')->limit(5)->get();

Затем можно добавить загруженную загрузку, чтобы получить 5 видео из них:

$top5CatWithVideos = Category::withCount('video')->with(['video' => function($q){
    return $q->take(5);
}])->orderBy('video_count', 'desc')->limit(5)->get();

Предложение обновить функцию отношенияот video до videos как hasMany

Теперь добавляем пользователя каждого видео:

$top5CatWithVideos = Category::withCount('video')->with(['video' => function($q){
        return $q->take(5);
}, 'video.user'])->->orderBy('video_count', 'desc')->limit(5)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...