我正在DataTable中使用服务器端呈现。
我有一个变量,用于确定limit
到数据库中的行数。
我正在尝试获取100行,并从页面长度为25
的DataTable中将其分页到4
页。
此外,如果限制变量为4
或10
,或者小于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
行,然后对其进行分页?
我希望我的帖子清楚。
答案 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();