Laravel 7中的AJAX分页(内部服务器错误)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 7中的AJAX分页(内部服务器错误)相关的知识,希望对你有一定的参考价值。

我正在使用Laravel 7,并且我想使用ajax进行分页,以便在单击下一页时不会刷新整个页面。我进行了搜索以解决我的问题,但是它不起作用,并且每当我在控制器中使用error_log()时,它都不会进入fetch()。每当我单击第2页时,都会出错。在控制台中,显示的错误是:

app.js:16437 GET http://127.0.0.1:8000/ledger/fetch?page=2 500 (Internal Server Error)

在storage / logs / laravel.log中

[previous exception] [object] (BadMethodCallException(code: 0): Method Illuminate\Database\Eloquent\Collection::links does not exist. at C:\xampp\htdocs\final_Financial\fin_book_09\vendor\laravel\framework\src\Illuminate\Support\Traits\Macroable.php:103)

LedgerController.php

    public function index(Request $request)
    {
        $disableLedger = true;
        $ledger = Ledger::orderBy('id', 'DESC')
            ->where('user_id', auth()->user()->id)
            ->paginate(5);
        $ledgerCatType = DB::table('ledgers')
            ->orderBy('ledgers.id', 'DESC')
            ->join('categories', 'ledgers.cat_id', '=', 'categories.id')
            ->where('ledgers.user_id', auth()->user()->id)
            ->get('categories.type');
        $category = Category::where('user_id', auth()->user()->id)->get();
        return view('ledgers.index', [
            'ledgers' => $ledger,
            'categories' => $category,
            'disableLedger' => $disableLedger,
            'ledgerCatType' => $ledgerCatType
        ]);
    }
    function fetch(Request $request)
    {
        if ($request->ajax())
        {
            $ledger = Ledger::orderBy('id', 'DESC')
                ->where('user_id', auth()->user()->id)
                ->paginate(5);
            $ledgerCatType = DB::table('ledgers')
                ->orderBy('ledgers.id', 'DESC')
                ->join('categories', 'ledgers.cat_id', '=', 'categories.id')
                ->where('ledgers.user_id', auth()->user()->id)
                ->get('categories.type');
            $category = Category::where('user_id', auth()->user()->id)->get();
            return view('ledger.entries', compact('ledger', 'categories', 'ledgerCatType'))->render();
        }
    }

脚本

$(document).ready(function () {
    $('.pagination a').on('click', function(event) {
        event.preventDefault();
        var page = $(this).attr('href').split('page=')[1];
        fetch(page);
    })
    function fetch(page) {
        $.ajax({
            url : '/ledger/fetch?page='+page,
            success : function(data)
            {
                $('#ledger-entry').html(data);
            },
            error : function(){ 
                alert("error!!!!");
            }
        });
    }
});

在文件夹分类帐下,将在index.blade.php中调用entries.blade.php

<div class="outer-cont">
    <table class="table container inner-cont">
        <thead>
            <th scope="col">Date</th>
            <th scope="col">Description</th>
            <th scope="col">Category</th>
            <th scope="col">Amount</th>
            <th scope="col"></th>
        </thead>
        <tbody>
            @for($i = 0; $i < count($ledgers); $i++)
            <tr scope="row">
                <td class="tbl-date">{{ $ledgers[$i]->month }} {{ $ledgers[$i]->day }}, {{ $ledgers[$i]->year }}</td>
                <td class="tbl-desc">{{ $ledgers[$i]->description }} </td>
                <td>{{ $ledgers[$i]->category}} </td>
                @if($ledgerCatType[$i]->type == "Expense")
                <td class="tbl-amount" style="color: #FF5349;">Php ({{ $ledgers[$i]->amount }})</td>
                @else
                <td class="tbl-amount" style="color: #3BC23E;">Php {{ $ledgers[$i]->amount }}</td>
                @endif
            </tr>
            @endfor
    </table>
</div>
<div class="pagination">{!! $ledgers->links() !!}</div>

index.blade.php

<div id="ledger-entry">
    @include('ledgers.entries')
</div>

web.php

Route::resource('ledger','LedgerController')->middleware('auth');
Route::get('/ledger/fetch', 'LedgerController@fetch')->middleware('auth');
答案

好吧,我已经解决了。我只是将答案发布在这里,以防有人陷入困境。问题是我的路线,而不是使用手动添加路线的resource

Route::get('ledger', 'LedgerController@index')->name('ledger.index')->middleware('auth');
Route::post('/ledger', 'LedgerController@store')->name('ledger.store')->middleware('auth');
Route::delete('/ledger/{id}', 'LedgerController@destroy')->name('ledger.destroy')->middleware('auth');
Route::get('/ledger/fetch', 'LedgerController@index')->name('ledger.fetch')->middleware('auth');

我还编辑了index()的代码,并将其与fetch()方法结合在一起,因此现在看起来像这样:

    public function index(Request $request)
    {
        $disableLedger = true;
        $ledgers = Ledger::orderBy('id', 'DESC')
            ->where('user_id', auth()->user()->id)
            ->paginate(10);
        $ledgerCatType = DB::table('ledgers')
            ->orderBy('ledgers.id', 'DESC')
            ->join('categories', 'ledgers.cat_id', '=', 'categories.id')
            ->where('ledgers.user_id', auth()->user()->id)
            ->select('categories.type')
            ->paginate(10);
        $categories = Category::where('user_id', auth()->user()->id)->get();
        if ($request->ajax())
        {
            return view('ledgers.entries', compact('ledgers', 'categories', 'ledgerCatType', 'disableLedger'))->render();
        }
        return view('ledgers.index',  compact('ledgers', 'categories', 'ledgerCatType', 'disableLedger'));
    }

以上是关于Laravel 7中的AJAX分页(内部服务器错误)的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Laravel 5.8 Ajax 表单提交中的内部服务器错误

Ajax 中的 Laravel 5 X-CSRF-TOKEN 500(内部服务器错误)

Laravel:为啥我的 ajax 请求返回“500(内部服务器错误)”?

Laravel 4 内部服务器错误 500 和 HTML 表中的 TokenMismatchException 以使用 ajax 更新数据库

Laravel ajax 帖子返回 500 内部服务器错误

500(内部服务器错误)在 Laravel 5 中使用 Ajax