服务器端渲染mysql限制n行和分页

时间:2019-10-01 04:30:33

标签: php mysql laravel datatables server-side-rendering

我正在DataTable中使用服务器端呈现。

我有一个变量,用于确定limit到数据库中的行数。

我正在尝试获取100行,并从页面长度为25的DataTable中将其分页到4页。

此外,如果限制变量为410,或者小于pagelength的值,那么所有记录将显示在single页面中。

这是我的代码:

#get datatable params
$draw = $this->request->input('draw');
$start = $this->request->input('start');
$dt_limit = $this->request->input('length'); // datatable pagination limit

$limit_rows = $this->request->input('limit');

# query
$result_product_urls = DB::table('product_match_unmatches')
        ->select('r_product_url', 'r_image_url_main')
        ->selectRaw('count(distinct s_product_url, r_product_url) as frequency, 
                GROUP_CONCAT(CONCAT(s_image_url, "&s_product_url=", s_product_url) SEPARATOR " | ") as source_products')
        ->groupBy('r_product_url')
        ->where('request_id', '=', $reqId)
        ->orderBy('frequency', 'DESC')
        ->take($limit_rows);

        $recordsTotal =   $result_product_urls->get()->count();
        $urls = $result_product_urls->offset($start)->limit($dt_limit)->get();

由于dataTable页长为25,因此它将始终从数据库中提取25行。

但是我需要基于$limit_rows而不是$dt_limit限制行。

如果我只做$urls = $result_product_urls->get();,则如果$limit_rows的值为100,则所有100行都显示在同一页面中。

如何从数据库中提取limit行,然后对其进行分页?

我希望我的帖子清楚。

2 个答案:

答案 0 :(得分:0)

我将对此进行介绍,但是对于我来说,根据代码示例您要完成的确切工作尚不完全清楚。

根据Laravel文档, take limit 似乎是等效的。 https://laravel.com/docs/5.8/queries#ordering-grouping-limit-and-offset(本节底部)

代码在做什么:

$limit_rows查询构建器对象中通过->take()方法使用$result_product_urls值:

# query
$result_product_urls = DB::table('product_match_unmatches')
        ->select('r_product_url', 'r_image_url_main')
        ->selectRaw('count(distinct s_product_url, r_product_url) as frequency, 
                GROUP_CONCAT(CONCAT(s_image_url, "&s_product_url=", s_product_url) SEPARATOR " | ") as source_products')
        ->groupBy('r_product_url')
        ->where('request_id', '=', $reqId)
        ->orderBy('frequency', 'DESC')
        ->take($limit_rows); /* <------------- limit_rows HERE */

但是在设置$dt_limit变量时,还可以将->limit()值和$urls方法一起使用:

$recordsTotal =   $result_product_urls->get()->count();
$urls = $result_product_urls->offset($start)->limit($dt_limit)->get();/*<-- dt_limit HERE */

如果您不想使用$dt_limit作为限制,那么不要使用它...?我想也许您正在尝试做的是对结果集进行限制的查询,然后对它进行 sub 限制?我找不到想这么做的理由,所以我可能会遗漏一些东西。我认为您无法在同一查询上使用->take()->limit()

这不能实现您的目标吗?:

# query
$result_product_urls = DB::table('product_match_unmatches')
        ->select('r_product_url', 'r_image_url_main')
        ->selectRaw('count(distinct s_product_url, r_product_url) as frequency, 
                GROUP_CONCAT(CONCAT(s_image_url, "&s_product_url=", s_product_url) SEPARATOR " | ") as source_products')
        ->groupBy('r_product_url')
        ->where('request_id', '=', $reqId)
        ->orderBy('frequency', 'DESC'); 
        /* ->take($limit_rows); remove this  */

        $recordsTotal =   $result_product_urls->get()->count();
        $urls = $result_product_urls->offset($start)
                        ->limit($limit_rows) /* set limit to $limit_rows */
                        ->get();

如果没有,那么也许您可以澄清。

答案 1 :(得分:-1)

使用偏移量和限制,即 $ users = DB :: table('users')-> skip(10)-> take(5)-> get(); 要么 $ users = DB :: table('users')-> offset(10)-> limit(5)-> get();