服务器端渲染 MySQL 限制 N 行并分页



我在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();

这将始终从数据库中获取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((;

最新更新