看来我的选择是错误的。我想要的数据表是每个主管姓名都可以有一个包含雇员姓名的子行。但是我得到的是:

{
  "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查询。

09-11 20:35