看来我的选择是错误的。我想要的数据表是每个主管姓名都可以有一个包含雇员姓名的子行。但是我得到的是:
{
"id": "2",
"name_supervisor": "Alex",
"name": "testStaff4",
"manager_id": "2",
"role_id": "1"
},
{
"id": "1",
"name_supervisor": "Andika",
"name": "testStaff1",
"manager_id": "1",
"role_id": "1"
}
这是我的查询:
$supervisors = DB::table('supervisors')->join('users','users.manager_id','=','supervisors.id')
->select(['supervisors.id','supervisors.name_supervisor','users.name','users.manager_id','users.role_id'])
->where('users.role_id',1)
->orWhere('users.role_id',null)
->groupBy('supervisors.name_supervisor');
return Datatables::of($supervisors)->make(true);
这是我的带有子行的js数据表:
function format ( d ) {
// `d` is the original data object for the row
return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
'<tr>'+
'<td>Name:</td>'+
'<td>'+d.name+'</td>'+
'</tr>'+
'</table>';
}
$(document).ready(function() {
var table = $('#ajax_data').DataTable({
processing: true,
serverSide: true,
ajax: 'supervisor/json',
dom: '<"top"f>rt<"bottom"lip><"clear">',
columnDefs: [{"className": "text-center", "targets": "_all"}],
columns: [
{
"className": 'details-control',
"orderable": false,
"data": null,
"defaultContent": ''
},
{ data: 'name_supervisor', name: 'supervisors.name_supervisor' }
]
});
} );
我在用户表中有
manager_id
,这是来自supervisors
表的外键。我想得到这样的json输出: {
"id": "1",
"name_supervisor": "Andika",
"name": "testStaff1","testStaff2","testStaff3"
"manager_id": "1",
"role_id": "1"
},
最佳答案
您需要在用户名上使用GROUP CONCAT,如下所示
$supervisors = DB::table('supervisors')->join('users','users.manager_id','=','supervisors.id')
->select(['supervisors.id','supervisors.name_supervisor',DB::raw('GROUP_CONCAT(users.name) as name'),'users.manager_id','users.role_id'])
->where('users.role_id',1)
->orWhere('users.role_id',null)
->groupBy('supervisors.name_supervisor');
return Datatables::of($supervisors)->make(true);
您可以看到该名称使用Group_Concat函数进行了分组,并且在分隔符和按类排序方面有更多选项,可以使其满足您的需要。
引用Laravel Query Model来使用聚合或字符串函数,因为您可以使用它mysql查询。