使用关系值搜索数据表
Search datatable with relationship values
当我需要在我的数据表上进行搜索时遇到问题。我有 4 列与另一个表的关系。在我的控制器上,我创建了一个连接来转换这些数据,所以当我在搜索框上放置一些 ID 时,过滤器工作得很好,但我需要让这个搜索只对屏幕上显示的数据起作用。
这是我的控制器:
public function revList(Request $request)
{
if(auth()->user()->can('Visualizar Revisão')){
$revisoes = DB::table('revisao_ambientes')
->join('unidades', 'revisao_ambientes.unidade_id', '=', 'unidades.id')
->join('blocos', 'revisao_ambientes.bloco_id', '=', 'blocos.id')
->join('ambientes', 'revisao_ambientes.ambiente_id', '=', 'ambientes.id')
->join('users', 'revisao_ambientes.user_id', '=', 'users.id')
->select([
'revisao_ambientes.unidade_id', 'unidades.name as unidade_name',
'revisao_ambientes.bloco_id', 'blocos.name as bloco_name',
DB::raw('CONCAT(ambientes.sala, " - ", ambientes.name) as ambiente_name'),
'revisao_ambientes.user_id', 'users.name as user_name',
'revisao_ambientes.created_at as created_at',
'revisao_ambientes.rev_id as rev_id',
]);
return datatables()->of($revisoes)
->addColumn('detalhes', function($row) {
return '<a href="revisao/'. $row->rev_id .'" class="label label-info">Detalhes</a>';
})
//Try to make a filter by the building (Don't work)
->filterColumn('bloco_name', function($revisoes, $search) {
$revisoes->where('blocos', 'LIKE', "{$search}%");
})
->rawColumns(['detalhes'])
->make(true);
}else{
return view('errors.401');
}
}
这是我的服务器端数据表脚本:
$(document).ready( function () {
$('#rev-datatable').DataTable({
dom: 'Blfrtip',
lengthMenu: [
[10, 25, 50, 100, -1],
[10, 25, 50, 100, "Todos"]
],
buttons: [
{ extend: 'copy', text: 'Copiar', exportOptions: {
columns: [ 0, 1, 2, 3, 4 ]
}},
{ extend: 'excel', text: 'Excel', exportOptions: {
columns: [ 0, 1, 2, 3, 4]
}},
{ extend: 'pdf', text: 'PDF', orientation: 'landscape',
pageSize: 'LEGAL', exportOptions: {
columns: [ 0, 1, 2, 3, 4]
}},
],
processing: true,
Filter: true,
lengthChange: true,
lengthMenu: [[10, 25, 50, 100, 200, -1], [10, 25, 50, 100, 200, "Todos"]],
order:[[0,'desc']],
serverSide: true,
ajax: "{{ url('/revisao/rev-list') }}",
columns: [
{ data: 'created_at', name: 'created_at' },
{ data: 'user_name', name: 'user_id' },
{ data: 'unidade_name', name: 'unidade_id' },
{ data: 'bloco_name', name: 'bloco_id' },
{ data: 'ambiente_name', name: 'ambiente_id' },
{ data: 'detalhes', searchable: false, orderable: false},
] ,
});
});
我需要做什么才能使它起作用?
提前致谢!
我不完全理解这个问题,但我发现您的列数据表选项有问题。名称 属性 定义了数据库中列的名称,因此将列更改为:
columns: [
{ data: 'created_at', name: 'revisao_ambientes.created_at' },
{ data: 'user_name', name: 'users.name' },
{ data: 'unidade_name', name: 'unidades.name' },
{ data: 'bloco_name', name: 'blocos.name' },
{ data: 'ambiente_name' },
{ data: 'detalhes', searchable: false, orderable: false},
] ,
此外,您不需要为 bloco_name 定义 filterColumn,但您需要为 ambiente_name 定义它。这就是为什么我在列中删除了 ambiente_name 的名称。现在删除 bloco_name 的 filterColumn 并添加:
->filterColumn('ambiente_name', function($revisoes, $search) {
$sql = "CONCAT(ambientes.sala, ' - ', ambientes.name) like ?";
$revisoes->whereRaw($sql, ["%{$search}%"]);
})
由于我们通过参数绑定注入 $search,因此没有 SQL 注入的风险。
另请注意,通过提及数据库列的实际名称,您将泄露有关内部数据库结构的信息,这被视为安全漏洞。如果您不关心那么这就是解决方案,但如果您关心为每一列编写 filterColumn,并从数据表列中删除所有 "name" 属性。
当我需要在我的数据表上进行搜索时遇到问题。我有 4 列与另一个表的关系。在我的控制器上,我创建了一个连接来转换这些数据,所以当我在搜索框上放置一些 ID 时,过滤器工作得很好,但我需要让这个搜索只对屏幕上显示的数据起作用。
这是我的控制器:
public function revList(Request $request)
{
if(auth()->user()->can('Visualizar Revisão')){
$revisoes = DB::table('revisao_ambientes')
->join('unidades', 'revisao_ambientes.unidade_id', '=', 'unidades.id')
->join('blocos', 'revisao_ambientes.bloco_id', '=', 'blocos.id')
->join('ambientes', 'revisao_ambientes.ambiente_id', '=', 'ambientes.id')
->join('users', 'revisao_ambientes.user_id', '=', 'users.id')
->select([
'revisao_ambientes.unidade_id', 'unidades.name as unidade_name',
'revisao_ambientes.bloco_id', 'blocos.name as bloco_name',
DB::raw('CONCAT(ambientes.sala, " - ", ambientes.name) as ambiente_name'),
'revisao_ambientes.user_id', 'users.name as user_name',
'revisao_ambientes.created_at as created_at',
'revisao_ambientes.rev_id as rev_id',
]);
return datatables()->of($revisoes)
->addColumn('detalhes', function($row) {
return '<a href="revisao/'. $row->rev_id .'" class="label label-info">Detalhes</a>';
})
//Try to make a filter by the building (Don't work)
->filterColumn('bloco_name', function($revisoes, $search) {
$revisoes->where('blocos', 'LIKE', "{$search}%");
})
->rawColumns(['detalhes'])
->make(true);
}else{
return view('errors.401');
}
}
这是我的服务器端数据表脚本:
$(document).ready( function () {
$('#rev-datatable').DataTable({
dom: 'Blfrtip',
lengthMenu: [
[10, 25, 50, 100, -1],
[10, 25, 50, 100, "Todos"]
],
buttons: [
{ extend: 'copy', text: 'Copiar', exportOptions: {
columns: [ 0, 1, 2, 3, 4 ]
}},
{ extend: 'excel', text: 'Excel', exportOptions: {
columns: [ 0, 1, 2, 3, 4]
}},
{ extend: 'pdf', text: 'PDF', orientation: 'landscape',
pageSize: 'LEGAL', exportOptions: {
columns: [ 0, 1, 2, 3, 4]
}},
],
processing: true,
Filter: true,
lengthChange: true,
lengthMenu: [[10, 25, 50, 100, 200, -1], [10, 25, 50, 100, 200, "Todos"]],
order:[[0,'desc']],
serverSide: true,
ajax: "{{ url('/revisao/rev-list') }}",
columns: [
{ data: 'created_at', name: 'created_at' },
{ data: 'user_name', name: 'user_id' },
{ data: 'unidade_name', name: 'unidade_id' },
{ data: 'bloco_name', name: 'bloco_id' },
{ data: 'ambiente_name', name: 'ambiente_id' },
{ data: 'detalhes', searchable: false, orderable: false},
] ,
});
});
我需要做什么才能使它起作用?
提前致谢!
我不完全理解这个问题,但我发现您的列数据表选项有问题。名称 属性 定义了数据库中列的名称,因此将列更改为:
columns: [
{ data: 'created_at', name: 'revisao_ambientes.created_at' },
{ data: 'user_name', name: 'users.name' },
{ data: 'unidade_name', name: 'unidades.name' },
{ data: 'bloco_name', name: 'blocos.name' },
{ data: 'ambiente_name' },
{ data: 'detalhes', searchable: false, orderable: false},
] ,
此外,您不需要为 bloco_name 定义 filterColumn,但您需要为 ambiente_name 定义它。这就是为什么我在列中删除了 ambiente_name 的名称。现在删除 bloco_name 的 filterColumn 并添加:
->filterColumn('ambiente_name', function($revisoes, $search) {
$sql = "CONCAT(ambientes.sala, ' - ', ambientes.name) like ?";
$revisoes->whereRaw($sql, ["%{$search}%"]);
})
由于我们通过参数绑定注入 $search,因此没有 SQL 注入的风险。 另请注意,通过提及数据库列的实际名称,您将泄露有关内部数据库结构的信息,这被视为安全漏洞。如果您不关心那么这就是解决方案,但如果您关心为每一列编写 filterColumn,并从数据表列中删除所有 "name" 属性。