рендеринг на стороне сервера mysql ограничивает n строк и разбивает на страницы - PullRequest
0 голосов
/ 01 октября 2019

Я использую серверную визуализацию в DataTable.

У меня есть переменная, которая определяет limit количество строк в базе данных.

Я пытаюсь получить, скажем, 100строк и из DataTable с длиной страницы 25 разбивайте его на страницы 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 строк из базы данных, а затем разбить их на страницы?

Я надеюсь, что ясделай мой пост понятным.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Я попытаюсь сделать это, но мне не совсем ясно, что именно вы пытаетесь сделать, основываясь на примере кода.

Согласно документам Laravel take и предел представляется эквивалентным. 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();

Если нет, то, возможно, вы можете уточнить.

0 голосов
/ 01 октября 2019

использовать смещение по пределу, т.е. $ users = DB :: table ('users') -> skip (10) -> take (5) -> get ();или $ users = DB :: table ('users') -> offset (10) -> limit (5) -> get ();

...