【问题标题】:How to get row count using laravel fluent query builder如何使用 laravel fluent 查询生成器获取行数
【发布时间】:2019-10-28 01:31:44
【问题描述】:

如何使用 Laravel fluent 查询构建器获取行数

我已附加用于过滤其他数据的查询,并且我还需要获取行数。

这是数据库表:-

  $results = DB::table('newsfeed_posts')
    ->select('newsfeed_posts.*', 'users.first_name as posted_user_first_name', 'users.last_name as posted_user_last_name', 'users.profile_image as posted_user_profile_image','proid.profile_image as posted_receiver_profile_image', 'timeline.first_name as post_receiver_first_name', 'timeline.last_name as post_receiver_last_name', 'timeline.office_branch_id as post_receiver_office_id')
    ->leftJoin('users', 'users.id', 'newsfeed_posts.post_sender_id')
    ->leftJoin('users as timeline', 'timeline.id', 'newsfeed_posts.post_receiver_id') 
    ->leftJoin('users as proid', 'proid.id', 'newsfeed_posts.post_receiver_id') 
    ->where('newsfeed_posts.deleted_status', '0')
    // ->where('newsfeed_posts.post_sender_id', Auth::user()->id)
    ->where('newsfeed_posts.post_receiver_id', Auth::user()->id)
    ->groupBy('newsfeed_posts.id')
    ->orderBy('newsfeed_posts.id', 'DESC')
    ->get();

    return $results;

【问题讨论】:

标签: mysql laravel


【解决方案1】:

使用纯 Laravel 查询构建器,您可能需要发出两个单独的查询:

$count = DB::table('newsfeed_posts')
    ->select('newsfeed_posts.*', 'users.first_name as posted_user_first_name', 'users.last_name as posted_user_last_name', 'users.profile_image as posted_user_profile_image','proid.profile_image as posted_receiver_profile_image', 'timeline.first_name as post_receiver_first_name', 'timeline.last_name as post_receiver_last_name', 'timeline.office_branch_id as post_receiver_office_id')
    ->leftJoin('users', 'users.id', 'newsfeed_posts.post_sender_id')
    ->leftJoin('users as timeline', 'timeline.id', 'newsfeed_posts.post_receiver_id') 
    ->leftJoin('users as proid', 'proid.id', 'newsfeed_posts.post_receiver_id') 
    ->where('newsfeed_posts.deleted_status', '0')
    ->where('newsfeed_posts.post_receiver_id', Auth::user()->id)
    ->groupBy('newsfeed_posts.id')
    ->count();

然后,使用您当前的查询来生成您想要的结果集。

如果您在后台使用 MySQL 8+,那么还有另一种选择。我们可以尝试使用COUNT() 作为解析函数,只使用一个查询:

$results = DB::table('newsfeed_posts')
    ->selectRaw('COUNT(*) OVER () AS cnt, newsfeed_posts.*', 'users.first_name as posted_user_first_name', 'users.last_name as posted_user_last_name', 'users.profile_image as posted_user_profile_image','proid.profile_image as posted_receiver_profile_image', 'timeline.first_name as post_receiver_first_name', 'timeline.last_name as post_receiver_last_name', 'timeline.office_branch_id as post_receiver_office_id')
    ->leftJoin('users', 'users.id', 'newsfeed_posts.post_sender_id')
    ->leftJoin('users as timeline', 'timeline.id', 'newsfeed_posts.post_receiver_id') 
    ->leftJoin('users as proid', 'proid.id', 'newsfeed_posts.post_receiver_id') 
    ->where('newsfeed_posts.deleted_status', '0')
    ->where('newsfeed_posts.post_receiver_id', Auth::user()->id)
    ->groupBy('newsfeed_posts.id')
    ->orderBy('newsfeed_posts.id', 'DESC')
    ->get();

整个结果集的计数(在GROUP BY 聚合之后)然后可以使用别名cnt 获得。

【讨论】:

    【解决方案2】:

    如果您想从数据库中获取所有已过滤的记录以及已获取项目记录的数量。然后您可以首先使用使用get() 函数获取所有结果,在此结果上您可以使用->count() 获取所有获取的项目计数。

    $result = DB::table('newsfeed_posts')
        ->select('newsfeed_posts.*', 'users.first_name as posted_user_first_name', 'users.last_name as posted_user_last_name', 'users.profile_image as posted_user_profile_image','proid.profile_image as posted_receiver_profile_image', 'timeline.first_name as post_receiver_first_name', 'timeline.last_name as post_receiver_last_name', 'timeline.office_branch_id as post_receiver_office_id')
        ->leftJoin('users', 'users.id', 'newsfeed_posts.post_sender_id')
        ->leftJoin('users as timeline', 'timeline.id', 'newsfeed_posts.post_receiver_id') 
        ->leftJoin('users as proid', 'proid.id', 'newsfeed_posts.post_receiver_id') 
        ->where('newsfeed_posts.deleted_status', '0')
        // ->where('newsfeed_posts.post_sender_id', Auth::user()->id)
        ->where('newsfeed_posts.post_receiver_id', Auth::user()->id)
        ->groupBy('newsfeed_posts.id')
        ->orderBy('newsfeed_posts.id', 'DESC')
        ->get();
    
    return [
        'total' => $result->count(),
        'result' => $result
    ];
    

    【讨论】:

    • 不,我需要将行数作为变量,然后我可以在前端显示计数
    • @Fed 立即查看。
    猜你喜欢
    • 2013-08-07
    • 2015-11-20
    • 2013-01-05
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2018-02-16
    • 2013-01-06
    • 2020-12-17
    相关资源
    最近更新 更多