使用group by和union时,Laravel分页不起作用

问题描述 投票:0回答:2

大家晚上好,我有laravel paginator的问题,我有一个查询,包含以下三个请求

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);
php laravel laravel-5.7
2个回答
0
投票

我找到了解决问题的方法,只需模仿paginate方法如下:

 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


0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.