我在Laravel 7中使用了DataTable 1.10.21。我试图填充所有用户数据,除了我的用户表还有一个名为group_id的附加列,它定义了用户组(即admin,manager,用户等)
现在我的用户模型具有以下关系:
public function group() {
return $this->belongsTo(Group::class);
}
当我打电话
App\User::select(*)->with('group')->get();
我会得到类似这样的东西:
App\User {#105150
id: 1,
group_id: 1,
name: "Admin",
email: "admin@admin.com",
email_verified_at: "2020-01-01 01:01:01",
...
deleted_at: null,
group: App\Group {#105096
id: 1,
name: "admin",
},
}
...
在我的UserController中,我具有以下功能:
public function datatable() {
$data = User::select("*")->with('group');
$dt = Datatables::of($data)->make(true);
\Log::debug($dt); //this works!!
return $dt;
}
我可以使用修补程序毫无问题地获取$ data和$ dt。
我的视图包含以下javascript:
$(function() {
$('#table').DataTable({
processing: true,
serverSide: true,
ajax: '{{ url('user/datatable') }}',
columns: [
{ data: 'id', name: 'id' },
{ data: 'name', name: 'name' },
{ data: 'group_id', name: 'group_id' }, /* this won't work */
{ data: 'group.name', name: 'group.name' }, /* this won't work either */
{ data: 'created_at', name: 'created_at' },
{ data: 'email', name: 'email' }
]
});
});
<table class="table table-bordered" id="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Group ID</th>
<th>Group Name</th>
<th>Creation Date</th>
<th>Email</th>
</tr>
</thead>
</table>
group_id或group.name col都不起作用。 (net :: ERR_EMPTY_RESPONSE错误,甚至$ dt都有响应),但是如果我同时删除了两列,则可以正常工作。
请告知。
编辑:2020年5月29日
我进行了更深入的研究,这是我发现的东西:
如果我使用本地测试域(即myproject.test)
如果我使用127.0.0.1:8000
有人可以向我解释为什么吗?
答案 0 :(得分:0)
如果您使用的是Yajra\DataTables
,那么我会发现您没有很好地指定几列。让我们从头开始。
首先,在控制器中进行如下更改:
use Yajra\DataTables\DataTables;
public function datatable() {
$data = User::with(['group'])->select("users.*"); // Also select can throw ambiguous column error
return Datatables::of($data)
->addColumn('group_id', function ($user) {
return !empty($user->group) ? $user->group->id : '';
})->addColumn('group_name', function ($user) {
return !empty($user->group) ? $user->group->name : '';
})->toJson(true); // Please note this line also
}
然后在您的JS中:
$(function() {
$('#table').DataTable({
processing: true,
serverSide: true,
ajax: '{{ url('user/datatable') }}',
columns: [
{ data: 'id', name: 'id' },
{ data: 'name', name: 'name' },
{ data: 'group_id', name: 'group.id' }, // Data is specified data in controller and name is relationship data
{ data: 'group_name', name: 'group.name' },
{ data: 'created_at', name: 'created_at' },
{ data: 'email', name: 'email' }
]
});
});
答案 1 :(得分:0)
Yajra \ Datatables是我个人更喜欢使用原始sql的那些区域之一。
根据您的上述要求,我会这样看
$data = DB::select("
Select
a.id as 'users.id',
a.name as 'users.name',
b.id as 'group.id',
b.name as 'group.name',
a.created_at as 'users.created_at',
a.email as 'users.email'
FROM
users as a
LEFT JOIN
groups as b
ON
a.group_id = b.id");
$data = Datatables::of($data)->make(true);
return $data;
然后在数据表初始化代码的“列”部分中,仅使用“ users.id”,“ users.name”等(与名称字段相同)更新数据。
Yajra很棒,但是我遇到了麻烦,并且雄辩了自己。因此,为什么我只返回原始sql,此后就没有问题了。
编辑-使用新数据: 然后,建议您发布已加载到相关服务器的.env文件。您是在本地进行所有操作,还是在其他服务器上遇到问题?