【问题标题】:AJAX pagination in Laravel 7 (Internal Server Error)Laravel 7 中的 AJAX 分页(内部服务器错误)
【发布时间】:2020-09-24 08:48:45
【问题描述】:

我正在使用 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 中将调用的文件夹 ledgers
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');

【问题讨论】:

  • 您能否检查您的storage/logs,这可能会显示您的错误的其他信息。如果您的日志中有错误,请将其粘贴到您的问题中。
  • 我对 Laravel 还很陌生。错误是否显示在日期和时间之后?
  • 这是您的实际代码吗?您提供给视图的变量名称是 $ledger 而不是 $ledgers 因此,如果这是您的实际代码,您将收到未定义的变量错误
  • 写在我的索引里,我要加索引。
  • @Ven 很抱歉回复晚了,是的,日志名称中有日期/时间。

标签: php jquery ajax laravel pagination


【解决方案1】:

好吧,没关系,我修好了。我只是在这里发布答案,以防有人也被它困住。 问题是我的路线,而不是使用 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'));
    }

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2020-02-12
    • 2018-08-09
    • 2018-04-16
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多