方法 Yajra\DataTables\CollectionDataTable::where 不存在

Posted

技术标签:

【中文标题】方法 Yajra\\DataTables\\CollectionDataTable::where 不存在【英文标题】:Method Yajra\DataTables\CollectionDataTable::where does not exist方法 Yajra\DataTables\CollectionDataTable::where 不存在 【发布时间】:2021-05-27 11:01:10 【问题描述】:

我在 Laravel 项目中有一个数据表。我创建了一个下拉过滤器来过滤 KPI 列。 这是我的视图代码

$(function() 

            $.ajaxSetup(
                headers: 
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                
            );

            var table = $('.data-table').DataTable(
                paging: true,
                info: true,
                autoWidth: false,
                responsive: true,
                processing: true,
                serverSide: true,
                ajax: 
                    url: " route('my.task') ",
                    data: function(d) 
                        d.kpi = $('#filter-kpi').val(),
                            d.search = $('input[type="search"]').val()
                    
                ,

                columns: [
                        data: 'DT_RowIndex',
                        name: 'DT_RowIndex',
                        orderable: false,
                        searchable: false,
                    ,
                    
                        data: 'title',
                        name: 'title',
                        orderable: false,
                    ,
                    
                        data: 'content',
                        name: 'content',
                        orderable: false,
                        visible: false,
                    ,
                    
                        data: 'progress',
                        name: 'progress'
                    ,
                    
                        data: 'status',
                        name: 'status'
                    ,
                    
                        data: 'kpi',
                        name: 'kpi'
                    ,
                    
                        data: 'target_selesai',
                        name: 'target_selesai'
                    ,
                    
                        data: 'action',
                        name: 'action',
                        orderable: false,
                        searchable: false
                    ,
                ]
            );

            $('#createNewProduct').click(function() 
                ...
            );

            $('body').on('click', '.editProduct', function() 
               ...
            );

            $('body').on('click', '.detailProduct', function() 
               ...
            );

            $('#saveBtn').click(function(e) 
               ...
            );

            $('body').on('click', '.deleteProduct', function() 
               ...
                    );
                 else 
                    return false;
                
            );


            $('#filter-kpi').change(function() 
                table.draw();
            );
        );

这是我的控制器

 public function MyTask(Request $request)
    
        // if (Auth::user()->jabatan != "Staff") 
        //     abort(403);
        // 

        if ($request->ajax()) 
            //$data = Post::where('user_id', Auth::user()->uid)->latest()->get();
            $data = Post::select('*');
            return Datatables::of($data)
                ->addIndexColumn()
                ->addColumn('action', function ($row) 
                   ... 
                )->addColumn('target_selesai', function ($row) 
                    
                )->addColumn('kpi', function ($row) 
                   ...                    
                )
                ->addColumn('progress', function ($row) 
                  ...
                    
                )->addColumn('status', function ($row) 
                    ... 
                )->filter(function ($instance) use ($request) 
                    if ($request->get('kpi') == '0' || $request->get('kpi') == '1') 
                        $instance->where('kpi', $request->get('kpi'));
                    
                    if (!empty($request->get('search'))) 
                        $instance->where(function ($w) use ($request) 
                            $search = $request->get('search');
                            $w->orWhere('title', 'LIKE', "%$search%")
                                ->orWhere('content', 'LIKE', "%$search%");
                        );
                    
                )

                ->rawColumns(['action', 'progress', 'status'])
                ->make(true);
        

        return view('task.mytask');
    

我的下拉过滤器

<div class="form-group">
        <label><strong>KPI :</strong></label>
        <select id='filter-kpi' class="form-control" style="width: 200px" data-column="5">
            <option value="">Semua</option>
            <option value="1">KPI</option>
            <option value="0">Non-KPI</option>
        </select>
    </div>

当我使用$data = Post::select('*'); 时,程序运行良好。但是,我想将其更改为$data = Post::where('user_id', Auth::user()-&gt;uid)-&gt;latest()-&gt;get();,但如果我使用下拉过滤器,它会弹出警告说“方法 Yajra\DataTables\CollectionDataTable::where 不存在”

我的代码有问题吗?提前致谢

【问题讨论】:

$data = Post::where('user_id', Auth::user()-&gt;uid)-&gt;latest(); 有效吗?传入查询构建器与集合实例可能会出现问题。 啊,谢谢,它工作得很好。为什么 get() 会导致错误? get() 返回一个 eloquent 集合的实例,通过省略该调用,它返回查询构建器实例。 datatables 包使用查询生成器链接。 非常感谢,顺便说一句,你可以评论作为答案给你一些额外的声誉 【参考方案1】:

删除对get()的调用,以便您拥有:

$data = Post::where('user_id', Auth::user()->uid)->latest();

这将返回 Eloquent 查询 Builder 实例,而不是 Collection 实例。

Datatables需要在后续方法链中使用builder实例。

【讨论】:

以上是关于方法 Yajra\DataTables\CollectionDataTable::where 不存在的主要内容,如果未能解决你的问题,请参考以下文章

init()方法和构造方法的区别

GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

Python中静态方法和类方法的区别

类方法和实例方法

Java中的构造方法与普通方法的区别? 啥情况下用构造方法啥情况下用普通的方法

Python中静态方法和类方法的区别