【问题标题】:Laravel datatable shows role nameLaravel 数据表显示角色名称
【发布时间】:2020-10-08 20:40:51
【问题描述】:

很好,我有不同角色的用户,我想知道如何在我的数据表中显示而不是角色的 id,我想查看角色的名称..

public function index(Request $request)
{
   // $users = User::orderBy('id', 'ASC')->paginate(5);
    //return view('admin.users.index', ['users' => $users]);
    if($request->ajax()){

        $data = User::latest()->get();
        return DataTables::of($data)
            ->addColumn('accion',function($data){
                $button = '<button type="button" name="edit" id="'.$data->id.'" class="edit btn btn-primary btn-sm">Edit</button>';
                $button .= '<button type="button" name="delete" id="'.$data->id.'" class="delete btn btn-danger btn-sm">Delete</button>';
                return $button;
            })
        ->rawColumns(['accion'])
        ->make(true);
    }
    return view('admin.users.index');
}

datatable.js

$(document).ready( function () {
   $('#table').DataTable({
            processing: true,
            serverSide: true,
            ajax: "/admin/users/",
            columns:
            [
              {
                data: 'id',
                name: 'id',
              },
              {
                 data:'name',
                 name: 'name',
              },
              {
                 data:'email',
                 name: 'email',
              },
              {
                 data:'role_id',
                 name: 'role_id',
              },
              {
                 data:'accion',
                 name: 'accion',
                 orderable:false
              },
            ]
        });
} );

它显示了角色的 id,但我想访问角色的 name 属性

【问题讨论】:

  • 您将在User 模型中建立一个名为roles 的关系,执行类似于以下答案的操作,然后像roles.name 一样访问它
  • 我照原样做,关系已经存在。错误数据表,但它给了我
  • 那么你必须避免以这种方式使用数据表,你需要从控制器为数据表创建一个数据数组,就像你为动作做了一个,然后将数据传递给表。

标签: jquery laravel eloquent datatable


【解决方案1】:

首先要确保在查询用户数据时加载角色信息,以防止多次查询

$data = User::with('role')->latest()->get();

然后将 role.name 添加到数据表中:

{
    data: 'role.name',
    name: 'role'
}

这些示例假设您已经在用户模型上设置了关系并且它被命名为“角色”。

【讨论】:

  • 我的表叫roles,和role_id有关系
【解决方案2】:

来自控制器或路由,只是一个例子

Route::get('/table_data', function (Request $request) {

$columns = array( 
    0 => 'id', 
    1 => 'key', 
    2 => 'doc_name',
    3 => 'name',
    4 => 'email',
    5 => 'phone',
    6 => 'city',
    7 => 'options'
);

//Below are some code for pagination of datatable and counts etc...
$totalData = Patient::count();
$totalFiltered = $totalData;

$limit = $request->input('length');
$start = $request->input('start');
$order = $columns[$request->input('order.0.column')];
$dir = $request->input('order.0.dir');
if(empty($request->input('search.value'))){
    $patients = Patient::offset($start)
                ->limit($limit)
                ->orderBy($order,$dir)
                ->get();
}
else
{
    //Below code is for search facility real time searching in datatable
    $search = $request->input('search.value'); 
    $patients =  Patient::with('doctor')
                ->where('name', 'LIKE', "%{$search}%")
                ->orWhere([
                    ['email', 'LIKE', "%{$search}%"],
                    ['phone', 'LIKE', "%{$search}%"],
                    ['city', 'LIKE', "%{$search}%"]
                ])
                ->offset($start)
                ->limit($limit)
                ->orderBy($order,$dir)->get();

    $totalFiltered = Patient::with('doctor')->where('name','LIKE',"%{$search}%")->orWhere([
                    ['email', 'LIKE', "%{$search}%"],
                    ['phone', 'LIKE', "%{$search}%"],
                    ['city', 'LIKE', "%{$search}%"]
                ])->count();
}

$data = array();

if(!empty($patients))
{
    foreach ($patients as $key=>$patient)
    {
        $nestedData['id'] = $patient->id;
        $nestedData['key'] = $key;
        //Here this is what I wanted to point out for you, it's a relationship, like in your case it will be something like $user->role->name
        $nestedData['doc_name'] = $patient->doctor->name;
        $nestedData['name'] = $patient->name;
        $nestedData['email'] = $patient->email;
        $nestedData['phone'] = $patient->phone;
        $nestedData['city'] = $patient->city;

        $nestedData['options'] = '<div class="btn-group">
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action
                      <span class="caret"></span>
                      <span class="sr-only">Toggle Dropdown</span>
                    </button>
                    <ul class="dropdown-menu edit-options dropdown-menu-right dropdown-default" user="menu">
                    <li>
                        <button="type" class="btn btn-link view"><i class="fa fa-eye"></i> View</button>
                    </li><li>
                    <a href="#" class="btn btn-link"><i class="fa fa-edit"></i> Edit</a>
                </li><li>
                      <button type="submit" class="btn btn-link" onclick="return confirmDelete()"><i class="fa fa-trash"></i> Delete</button> 
                    </li>
                </ul>
            </div>';

        $nestedData['patient'] = array( '[ "'.$nestedData['id'].'"', ' "'.$nestedData['key'].'"', ' "'.$nestedData['name'].'"', ' "'.$nestedData['email'].'"', ' "'.$nestedData['phone'].'"', ' "'.$nestedData['city'].'"]'
        );
        $data[] = $nestedData;
    }
}

$json_data = array(
    "draw"            => intval($request->input('draw')),  
    "recordsTotal"    => intval($totalData),  
    "recordsFiltered" => intval($totalFiltered), 
    "data"            => $data   
);

  echo json_encode($json_data);
});

在数据表中你会做这样的事情

$('#example').DataTable( {
        "processing": true,
        "serverSide": true,
        // "scrollY": 200,
        // "deferRender": true,
        // "scroller": true,
        "ajax":{
            url:"{{ url('table_data') }}",
            dataType: "json",
            type:"get"
        },
        "createdRow": function( row, data, dataIndex ) {
            $(row).addClass('patient-link');
            $(row).attr('data-patient', data['patient']);
        },
        "columns": [
            {"data": "key"},
            {"data": "doc_name"},
            {"data": "name"},
            {"data": "email"},
            {"data": "phone"},
            {"data": "city"},
            {"data": "options"}
        ],
        'language': {
            'searchPlaceholder': "Type patient name",
            'lengthMenu': '_MENU_ records per page',
            "info": 'Showing _START_ - _END_ (_TOTAL_)',
            "search": ' Search',
            'paginate': {
                    'previous': 'Previous',
                    'next': 'Next'
            }
        },
        'columnDefs': [
            {
                orderable: false,
                targets: [0, 6],
            },
            {
                'targets': 0
            }
        ],
        order:[[1, 'asc']],
        'lengthMenu': [[10, 25, 50, -1], [10, 25, 50, "All"]],
        dom: '<"row"lfB>rtip'
    } );

注意:我已经粘贴了这个完整的代码,因为我花了很多时间让数据表在 laravel 中工作,你也可以添加复选框和按钮。而且我认为这段代码将帮助许多对 laravel 不熟悉数据表的人,最重要的是,这包括数据表的全部功能,只需启用它的库,一切都会正常工作

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2014-09-23
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2018-05-09
    • 2018-07-27
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多