如何使用 Laravel 分页执行 select2 结果无限滚动

How can I perform a select2 result infinite scroll with Laravel pagination

我创建了一个 returns 产品数据 json 的函数,我想以无限滚动的方式在 select2 中显示它。目前只能按照分页结果数显示

这是我的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Str;
use App\Models\Product;

class ReceiveInventoryController extends Controller
{
    public function index(Request $request) {
        return view('receive-inventory.index');
    }

    public function getProducts(Request $request){
        $search = $request->search;
        if($search == ''){
            $products = Product::orderby('name','asc')->select('id','name')->paginate(8);
        } else {
            $products = Product::orderby('name','asc')->select('id','name')->where('name', 'like', '%' .$search . '%')->paginate(8);
        }

        $response = array();
        foreach($products as $product){
            $response[] = array(
                "id" => $product->id,
                "text" => $product->name
            );
        }
        return response()->json($response);
    }
}

这是我的 select2 JS ajax 调用:

var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
$(document).ready(function () {
    $.noConflict();
    $('#products-list').select2({
        ajax: {
            url: 'receive-inventory/get-products',
            type: 'post',
            dataType: 'json',
            delay: 250,
            data: function(params) {
                var query = {
                    _token: CSRF_TOKEN,
                    search: params.term, // search term
                    page: params.page || 1
                };

                // Query parameters will be ?search=[term]&page=[page]
                return query;
            },
            processResults: function(response) {
                return {
                    results: response
                };
            },
            cache: true
        }
    });
});

我想我已经快找到答案了。就是缺一点东西。

感谢@apokryfos 的帮助!

我通过重构我的 getProducts 函数设法解决了这个问题:

public function getProducts(Request $request, Product $product) {
        $products = $request->search
            ? Product::where('name', 'LIKE', "%$request->search%")
            : new Product();

        return $products->paginate(10, ['*'], 'page', $request->page)->toArray();
}

以及在 Select2 JS 中检索数据:

var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
$(document).ready(function () {
    $.noConflict();
    $("#products-list").select2({
        ajax: {
            url: "receive-inventory/get-products",
            type: 'POST',
            dataType: 'json',
            delay: 250,
            data: function(params) {
                return {
                    _token: CSRF_TOKEN,
                    q: params.term, // search term
                    page: params.current_page
                };
            },
            processResults: function(data, params) {
                params.current_page = params.current_page || 1;

                return {
                    results: data.data,
                    pagination: {
                        more: (params.current_page * 30) < data.total
                    }
                };
            },
            autoWidth: true,
            cache: true
        },
        placeholder: 'Search for a product',
        minimumInputLength: 1,
        templateResult: formatProduct,
        templateSelection: formatProductSelection
    });

    function formatProduct(product) {
        if (product.loading) {
            return product.text;
        }

        var $container = $(
            "<div class='select2-result-product clearfix'>" +
            "<div class='select2-result-product__title'></div>" +
            "<div class='select2-result-product__description'></div>" +
            "</div>" +
            "</div>" +
            "</div>"
        );

        $container.find(".select2-result-product__title").text(product.name);
        $container.find(".select2-result-product__description").text(product.description);

        return $container;
    }

    function formatProductSelection(product) {
        return product.name || product.text;
    }
});

根据以上内容,我已将其格式化为在某些 div 容器上显示产品 namedescription。您可以格式化数据格式化accdg。满足您的需求。

我没有代表对已接受的答案发表评论,但想说声“谢谢”——这为实施无限滚动节省了大量时间。这是我的 Laravel 路由响应。我使用 when 方法稍微收紧了它。

return \App\Models\User::when(request()->get('q'), function($q) {
    $q->where('name', 'like', '%' . request()->get('q') . '%');
})->orderBy('name')->paginate(10, ['*'], 'page', request()->get('page'));