【问题标题】:Laravel 5.3, Call to undefined method Illuminate\Database\Query\Builder::links()Laravel 5.3,调用未定义的方法 Illuminate\Database\Query\Builder::links()
【发布时间】:2017-11-23 07:42:06
【问题描述】:

我正在尝试编写高级 Eloquent 搜索查询过滤器,但是当我返回集合以查看时,出现以下错误

Call to undefined method Illuminate\Database\Query\Builder::links()

我的 Eloquent 查询构建器:

$catalogos = Catalogo::query();

$catalogos->where('catalogo.subcategoria',$filtro)
                                ->join('productos', 'productos.catalogo_id','=','catalogo.id')
                                ->join('productos_precios','productos_precios.segment','=','productos.codigo_oracle')
                                ->join('fotos_productos','fotos_productos.producto_id','=','productos.id')
                                ->select('catalogo.descripcion', 'catalogo.descripcion_corta','catalogo.id','fotos_productos.nombre as ruta', 'productos_precios.precio')
                                ->whereNotNull('fotos_productos.nombre')
                                ->orderBy('precio', 'asc')
                                ->groupBy('catalogo.id')
                                ->paginate(24);

是的,如果我 dd($catalogos),它会返回一个 Builder 实例,但为什么呢?

我的视图代码如下(以防您认为我正在覆盖$catalogos 变量的值):

@foreach($catalogos as $catalogo)   

                            <div class="producto_tienda">
                                <a href="{{route('detalle-producto', [$catalogo->id,$catalogo->slug] ) }}">
                                    <div class="foto_producto" style="background-image:url('{{ asset("public/images/tienda/".$catalogo->ruta) }}')">
                                        @if($catalogo->stock>0 && $catalogo->stock<10)
                                        <div class="etiquetas">
                                            <p class="existencia">Últimos productos</p>
                                        </div>
                                        @endif

                                        @if($catalogo->stock==0)
                                        <div class="etiquetas">
                                            <p class="descuento">Agotado</p>
                                        </div>
                                        @endif

                                    </div>
                                </a>
                                <a href="{{route('detalle-producto', [$catalogo->id,$catalogo->slug])}}">
                                    <div class="descripcion_producto">{{ $catalogo->descripcion_corta }}</div>
                                </a>
                                <div class="precio_producto">{{ money_format( '%.2n' ,$catalogo->precio) }}</div>

                            </div>



                    @endforeach     
                    <div class="text-center">
                        {{ $catalogos->links() }}
                    </div>

【问题讨论】:

  • 如果你使用 {{ $catalogos->render() }}
  • link() 是 Catalogo 类的方法吗?
  • @Exprator 它显示了一个类似的错误:Call to undefined method Illuminate\Database\Query\Builder::render()
  • @Extrakun 方法link() 渲染laravel分页的html按钮
  • 好的,只需从查询中删除 groupby 就可以了

标签: php mysql laravel query-builder


【解决方案1】:

现在它似乎正在处理这个:

$catalogos = Catalogo::query();
$catalogos = $catalogos->where('catalogo.subcategoria',$filtro)
                                    ->join('productos', 'productos.catalogo_id','=','catalogo.id')
                                    ->join('productos_precios','productos_precios.segment','=','productos.codigo_oracle')
                                    ->join('fotos_productos','fotos_productos.producto_id','=','productos.id')
                                    ->select('catalogo.descripcion', 'catalogo.descripcion_corta','catalogo.id','fotos_productos.nombre as ruta', 'productos_precios.precio')
                                    ->whereNotNull('fotos_productos.nombre')
                                    ->orderBy('precio', 'asc')
                                    ->groupBy('catalogo.id')
                                    ->paginate(24);

【讨论】:

    【解决方案2】:

    您没有将paginate 的返回值分配给任何东西。应该是:

    $catalogos = Catalogo::query()->where('catalogo.subcategoria',$filtro)
                                ->join('productos', 'productos.catalogo_id','=','catalogo.id')
                                ->join('productos_precios','productos_precios.segment','=','productos.codigo_oracle')
                                ->join('fotos_productos','fotos_productos.producto_id','=','productos.id')
                                ->select('catalogo.descripcion', 'catalogo.descripcion_corta','catalogo.id','fotos_productos.nombre as ruta', 'productos_precios.precio')
                                ->whereNotNull('fotos_productos.nombre')
                                ->orderBy('precio', 'asc')
                                ->groupBy('catalogo.id')
                                ->paginate(24);
    

    【讨论】:

    • 这个想法是对查询应用过滤器,我不能一次放置所有查询。我需要从$catalogos = Catalogo::query() 开始,然后将每个搜索参数作为修饰符添加到从$catalogos = Catalogo::query(); 返回的查询实例中
    • 您问题中的代码在功能上与此相同。要么将query 的结果存储在变量中,要么直接使用它没有区别。二传手是fluent
    • 嗯,我明白你的意思了,我解决了这个问题,但我担心 laravel 文档中关于 groupBy 声明的分页的内容,它现在对我来说很好,但我不知道如果它总是能正常工作......
    • @AarónGutiérrez 值得研究,但措辞讲的是效率,所以希望它会起作用,但不会是最有效的方法。
    【解决方案3】:

    来自文档:

    目前,Laravel 无法有效地执行使用 groupBy 语句的分页操作。如果您需要使用 groupBy 与分页结果集,建议您查询数据库并手动创建分页器。

    您应该遵循文档并为您的查询创建手动分页器。

    https://laravel.com/docs/5.4/pagination#manually-creating-a-paginator

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 2017-02-14
      • 2017-03-31
      • 2018-10-03
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2014-04-23
      相关资源
      最近更新 更多