Разбиение на страницы Laravel не работает при использовании group by и union

Добрый вечер всем, у меня проблема с paginator laravel, у меня есть запрос, состоящий из трех запросов, которые являются следующими

public static function getActu($user_id){
    //  1 select all the articles published by the shop followed by a user
    $res = DB::table('users')
        ->join('user_folow_boutiques', 'user_folow_boutiques.user_id', '=', 'users.id')
        ->join('boutique', 'boutique.id', '=', 'user_folow_boutiques.boutique_id')
        ->join('type_article', 'type_article.boutique_id', '=', 'boutique.id')  
        ->join('article', 'type_article.id', '=', 'article.type_article_id')
        ->where('users.id','=',$user_id)
        ->select(DB::raw('article.*,article.created_at as date,null as nbrlik'));

    // 2 Select all the products that are liked by the users I followed
   $res2 =   DB::table('users')
        ->join('user_follow_user', 'user_follow_user.user_id_1', '=', 'users.id')
        ->join('user_aime_article', 'user_follow_user.user_id_2', '=', 'user_aime_article.user_id')
        ->join('article', 'user_aime_article.article_id', '=', 'article.id')
        ->where('users.id','=',$user_id)
        ->select(DB::raw('article.*,user_aime_article.created_at as date, null as nbrlik') )
        ->distinct();
        // 3 Select all the products of the shop followed by the user and who have exactly 50 likes
    $res3 =   DB::table('users')
        ->join('user_folow_boutiques', 'user_folow_boutiques.user_id', '=', 'users.id')
        ->join('boutique', 'boutique.id', '=', 'user_folow_boutiques.boutique_id')
        ->join('type_article', 'type_article.boutique_id', '=', 'boutique.id')  
        ->join('article', 'type_article.id', '=', 'article.type_article_id')
        ->join(DB::raw('(SELECT article.id c_id, count(user_aime_article.id) as nbrlik FROM article JOIN user_aime_article on user_aime_article.article_id = article.id GROUP BY user_aime_article.article_id) e'),'article.id','=','e.c_id')
        ->where('users.id','=',$user_id)
        ->where('e.nbrlik','=',50)
        ->select(DB::raw('article.*,article.created_at as date,  e.nbrlik'))
        ->union($res)
        ->union($res2)
        ->groupBy('article.id')
        ->orderBy('date','desc')
        ->paginate(20)
        ->get();
        return $res3;
}

Мне нужна эта информация, чтобы иметь возможность создать ленту новостей на сайте моего клиента, и мне нужна нумерация страниц для создания бесконечной прокрутки, но это не работает

Я искал эту проблему в сети и обнаружил, что использование метода paginate (x) с groupby невозможно, и чтобы обойти это, я должен создать пейджинг, и я попробовал следующее, но это не работает.

 $paginate = 5;
    $list_news = User::getActu(Auth::user()->id);// without  ->paginate(20);
    $slice = array_slice($list_news->toArray(), $paginate * ($page - 1), $paginate);
    $result = new  Paginator($slice, 20);

Вы можете имитировать разбивку на страницы, используя skip() и take(), например: $list_news = User::getActu(Auth::user()->id)->skip($paginate)->take(20), просто увеличивайте переменную $paginate при каждом вызове.

N Mahurin 25.02.2019 20:24

спасибо за ответ буду тестить

Abdelghani Benkoulal 26.02.2019 17:54

спасибо теперь работает

Abdelghani Benkoulal 26.02.2019 19:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
194
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

j'ai trouvé une решение моей проблемы, il faut just imiter la méthode paginate comme suite:

 public static function getActu($user_id,$page){
    $paginate = 5;
    //  1 selectionnée tous les article publier par les shop suivi
    $res = DB::table('users')
        ->join('user_folow_boutiques', 'user_folow_boutiques.user_id', '=', 'users.id')
        ->join('boutique', 'boutique.id', '=', 'user_folow_boutiques.boutique_id')
        ->join('type_article', 'type_article.boutique_id', '=', 'boutique.id')  
        ->join('article', 'type_article.id', '=', 'article.type_article_id')
        ->where('users.id','=',$user_id)
        ->select(DB::raw('article.*,article.created_at as date,null as nbrlik'));

    // 2 Selectionnée tous les produit amai par les utilisateur suivit Arevoir demain 
   $res2 =   DB::table('users')
        ->join('user_follow_user', 'user_follow_user.user_id_1', '=', 'users.id')
        ->join('user_aime_article', 'user_follow_user.user_id_2', '=', 'user_aime_article.user_id')
        ->join('article', 'user_aime_article.article_id', '=', 'article.id')
        ->where('users.id','=',$user_id)
        ->select(DB::raw('article.*,user_aime_article.created_at as date, null as nbrlik') )
        ->distinct();
        // Selectioner tous les proiduit  des boutique suivi par le user qui ont 50 j'aime
    $res3 =   DB::table('users')
        ->join('user_folow_boutiques', 'user_folow_boutiques.user_id', '=', 'users.id')
        ->join('boutique', 'boutique.id', '=', 'user_folow_boutiques.boutique_id')
        ->join('type_article', 'type_article.boutique_id', '=', 'boutique.id')  
        ->join('article', 'type_article.id', '=', 'article.type_article_id')
        ->join(DB::raw('(SELECT article.id c_id, count(user_aime_article.id) as nbrlik FROM article JOIN user_aime_article on user_aime_article.article_id = article.id GROUP BY user_aime_article.article_id) e'),'article.id','=','e.c_id')
        ->where('users.id','=',$user_id)
        ->where('e.nbrlik','=',50)
        ->select(DB::raw('article.*,article.created_at as date,  e.nbrlik'))
        ->union($res)
        ->union($res2)
        ->groupBy('article.id')
        ->orderBy('date','DESC')
        ->skip($paginate * ($page - 1) )->take($paginate)->get();
        return $res3;
}

Благодаря @N Mahurin

union и Paginate нельзя использовать вместе Вы можете попробовать этот.

        $res3 =   DB::table('users')
            ->join('user_folow_boutiques', 'user_folow_boutiques.user_id', '=', 'users.id')
            ->join('boutique', 'boutique.id', '=', 'user_folow_boutiques.boutique_id')
            ->join('type_article', 'type_article.boutique_id', '=', 'boutique.id')  
            ->join('article', 'type_article.id', '=', 'article.type_article_id')
            ->join(DB::raw('(SELECT article.id c_id, count(user_aime_article.id) as nbrlik FROM article JOIN user_aime_article on user_aime_article.article_id = article.id GROUP BY user_aime_article.article_id) e'),'article.id','=','e.c_id')
            ->where('users.id','=',$user_id)
            ->where('e.nbrlik','=',50)
            ->select(DB::raw('article.*,article.created_at as date,  e.nbrlik'))
            ->union($res)
            ->union($res2)
            ->groupBy('article.id')
            ->orderBy('date','DESC');
        $sql = $res3->toSql();

        $result = \DB::table(\DB::raw("($sql) as a"))->mergeBindings($res3)
            ->Paginate(10);

Другие вопросы по теме