You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Collection::appends()方法不存在错误排查与解决

Laravel部分CRUD页面报错:Method Illuminate\Database\Eloquent\Collection::appends does not exist

问题场景

Laravel后台的服务(Service)页面出现上述报错,但逻辑代码完全一致的项目(Portfolio)页面却能正常运行。

报错页面代码

ServiceController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Service;
use Intervention\Image\Facades\Image;

class ServiceController extends Controller
{
    public function index(Request $request)
    {
        $filter = $request->get('search_input');
        $services = Service::search($filter)->paginate(20);
        return view('admin.services.index', compact('services', 'filter'));
    }
}

Models/Service.php

class Service extends Model
{
    use HasFactory;
    protected $fillable = [
        'name',
        'subtitle',
        'description',
        'image'
    ];

    public function scopeSearch($query, $filter)
    {
        return $query->where('name', 'like', '%' . $filter . '%');
    }
}

对应视图分页代码

<div class="card-footer with-pagination">
      {{ $services->appends(['filter' => $filter])->links('vendor.pagination.bulma') }}
    </div>

正常运行页面代码

PortfolioController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Portfolio;
use Intervention\Image\Facades\Image;

class PortfolioController extends Controller
{
    public function index(Request $request)
    {
        $filter = $request->get('search_input');
        $projects = Portfolio::search($filter)->paginate(20);
        return view('admin.projects.index', compact('projects', 'filter'));
    }
}

Models/Portfolio.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Portfolio extends Model
{
    use HasFactory;
    protected $fillable = [
        'name',
        'short_desc',
        'desc',
        'image',
        'cat_id',
        'additional',
        'faq',
    ];

    public function scopeSearch($query, $filter)
    {
        return $query->where('name', 'like', '%' . $filter . '%');
    }
}

对应视图分页代码

<div class="card-footer with-pagination">
      {{ $projects->appends(['filter' => $filter])->links('vendor.pagination.bulma') }}
    </div>

错误原因

报错的核心是**$services变量实际是Eloquent Collection集合实例,而非分页器(LengthAwarePaginator)实例**。appends()是分页器类的专属方法,集合类没有该方法,因此触发报错。

出现差异的大概率原因是:当$filter为空(搜索框无输入)时,Service模型的search作用域生成where('name', 'like', '%%')的无效查询,在某些场景下(如数据库驱动特性、Laravel版本兼容问题),导致后续paginate()未正确返回分页器,而是直接返回集合;或者代码缓存保留了旧逻辑(比如曾用get()替代paginate())。

解决办法

  1. 修复search作用域的空值处理
    修改Service模型的scopeSearch方法,当$filter为空时直接返回原查询构造器,避免无效的like条件:
public function scopeSearch($query, $filter)
{
    if (!empty(trim($filter))) {
        return $query->where('name', 'like', '%' . trim($filter) . '%');
    }
    return $query;
}
  1. 验证变量类型
    在ServiceController的index方法中添加调试代码,确认$services的类型:
public function index(Request $request)
{
    $filter = $request->get('search_input');
    $services = Service::search($filter)->paginate(20);
    // 调试:查看变量类型
    dd(get_class($services));
    return view('admin.services.index', compact('services', 'filter'));
}

如果输出是Illuminate\Database\Eloquent\Collection,需排查中间件、模型trait等是否修改了查询结果;如果是分页器类型,可跳过此步骤。

  1. 清除Laravel缓存
    运行以下命令清除所有缓存,避免旧代码或配置导致的异常:
php artisan cache:clear
php artisan route:clear
php artisan config:clear
php artisan view:clear
  1. 检查视图变量是否被覆盖
    确认服务页面视图中,没有重新赋值$services变量(比如$services = Service::all();这类代码),避免覆盖分页器实例。

内容的提问来源于stack exchange,提问作者Yakoub Fergag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:54:52