我在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();
这将始终从数据库中获取25
行,因为 dataTable 页长为25
。
但是我需要根据$limit_rows
值而不是$dt_limit
来限制行。
如果我只做$urls = $result_product_urls->get();
,那么如果$limit_rows
值是100
,所有100
行都显示在同一页面中。
如何从数据库中获取limit
行,然后对其进行分页?
我希望我把我的帖子说清楚。
我会试一试,但我并不完全清楚您根据代码示例尝试完成的确切事情。
根据Laravel文档,采取和限制似乎是等效的。 https://laravel.com/docs/5.8/queries#ordering-grouping-limit-and-offset(本节底部(
代码看起来在做什么:
在$result_product_urls
查询生成器对象中将值与->take()
方法一起使用$limit_rows
:
# 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 */
但是在设置$urls
变量时,$dt_limit
值与->limit()
方法一起使用:
$recordsTotal = $result_product_urls->get()->count();
$urls = $result_product_urls->offset($start)->limit($dt_limit)->get();/*<-- dt_limit HERE */
如果您不想使用$dt_limit
作为限制,请不要使用它...?我想也许您要做的是对结果集进行限制的查询,然后对其进行子限制?我想不出想要这样做的理由,所以我可能错过了一些东西。我认为您不能对同一个查询使用->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();
如果没有,那么也许你可以澄清一下。
使用偏移量与限制,即 $users = DB::table('users'(->skip(10(->take(5(->get((; 或 $users = DB::table('users'(->offset(10(->limit(5(->get((;