方法 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()->uid)->latest()->get();
,但如果我使用下拉过滤器,它会弹出警告说“方法 Yajra\DataTables\CollectionDataTable::where 不存在”
我的代码有问题吗?提前致谢
【问题讨论】:
$data = Post::where('user_id', Auth::user()->uid)->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 不存在的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )