php BadMethodCallException方法Illuminate\Database\Eloquent\Collection::appends不存在

4uqofj5v  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(165)

这是我用的

{{ $products->appends(request()->except('page'))->links() }}

字符串
这是我的控制器

if ($request->get('sort') == 'sort-price_asc') {
       $products = Product::whereIn('id', $product_ids)->published()->paginate(12);
       $products = $products->sortBy(function ($prod) {
            return ceil(($prod->packs->count() > 0 ? $prod->packs->sortBy('pivot.add_time')->first()->volume : 1) * $prod->price);
        });
    }


但是为什么我会得到一个错误

Method Illuminate\Database\Eloquent\Collection::appends does not exist.

bsxbgnwa

bsxbgnwa1#

方法appends()来自Paginated集合。通过使用sortBy(),您将其转换为一个简单的Eloquent Collection,它不再具有该方法。
在调用->paginate()之前,您应该尝试对记录进行排序。我看到这个顺序非常复杂,所以你可以尝试使用原始查询。

55ooxyrt

55ooxyrt2#

出现错误“Method Illuminate\Database\Eloquent\Collection::appends does not exist”,因为您试图对集合($products)而不是Paginator类的示例使用appends方法。appends方法用于将查询参数添加到分页链接中,它在Paginator示例上可用,而在常规集合上不可用。
在代码中,首先使用paginate方法获取产品,该方法返回Paginator类的示例。但是,在下一个代码块中,您将通过使用sortBy方法对集合进行排序来覆盖$products变量,该方法将返回一个新的集合。由于新集合不是Paginator示例,因此appends方法不可用。
若要解决此问题,您应该在对数据进行分页之前对Paginator示例本身执行排序操作。可以使用orderBy方法直接从数据库查询中对数据进行排序。以下是如何修改代码:

if ($request->get('sort') == 'sort-price_asc') {
$products = Product::whereIn('id', $product_ids)
    ->published()
    ->orderByRaw('price * volume ASC')
    ->paginate(12);

$products->each(function ($prod) {
    $volume = $prod->packs->count() > 0 ? $prod->packs->sortBy('pivot.add_time')->first()->volume : 1;
    $prod->calculated_price = ceil($volume * $prod->price);
});

字符串
}

相关问题