Laravel 添加额外列时数据表出现 net::ERR_EMPTY_RESPONSE 错误
Laravel Datatables getting net::ERR_EMPTY_RESPONSE error when adding extra column
我在 Laravel 7 中使用 DataTable 1.10.21。我正在尝试填充所有用户数据,除了我的用户 table 有一个名为 group_id 的附加列,它定义了用户组(即管理员、经理、用户等)
现在我的用户模型有这样的关系:
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;
}
我可以使用 tinker 毫无问题地获取 $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 列都不起作用。 (net::ERR_EMPTY_RESPONSE 错误甚至 $dt 都有响应)但是如果我删除两列然后它工作正常。
请指教
编辑:2020 年 5 月 29 日
我进行了更深入的挖掘,这是我的发现:
如果我使用本地测试域(即 myproject.test)
- 如果我删除一些其他列(即创建于、电子邮件),它会起作用
- 如果我包含所有列(即 id、名称、group_id、group.name、created_at、电子邮件),我会收到 ERR_EMPTY_RESPONSE 错误
如果我使用 127.0.0.1:8000
- 即使我包含所有列,它仍然有效!!!!
有人可以解释一下为什么吗??
如果您使用的是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' }
]
});
});
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 很棒,但我 运行 对它和 eloquent 我自己都有问题。因此,为什么我只是回到原始 sql,从那以后就没有问题了。
编辑 - 使用新数据:
然后我建议你 post 你的 .env 文件已经加载到有问题的服务器上。您是在本地执行所有这些操作还是在单独的服务器上遇到问题?
我在 Laravel 7 中使用 DataTable 1.10.21。我正在尝试填充所有用户数据,除了我的用户 table 有一个名为 group_id 的附加列,它定义了用户组(即管理员、经理、用户等)
现在我的用户模型有这样的关系:
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;
}
我可以使用 tinker 毫无问题地获取 $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 列都不起作用。 (net::ERR_EMPTY_RESPONSE 错误甚至 $dt 都有响应)但是如果我删除两列然后它工作正常。
请指教
编辑:2020 年 5 月 29 日
我进行了更深入的挖掘,这是我的发现:
如果我使用本地测试域(即 myproject.test)
- 如果我删除一些其他列(即创建于、电子邮件),它会起作用
- 如果我包含所有列(即 id、名称、group_id、group.name、created_at、电子邮件),我会收到 ERR_EMPTY_RESPONSE 错误
如果我使用 127.0.0.1:8000
- 即使我包含所有列,它仍然有效!!!!
有人可以解释一下为什么吗??
如果您使用的是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' }
]
});
});
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 很棒,但我 运行 对它和 eloquent 我自己都有问题。因此,为什么我只是回到原始 sql,从那以后就没有问题了。
编辑 - 使用新数据: 然后我建议你 post 你的 .env 文件已经加载到有问题的服务器上。您是在本地执行所有这些操作还是在单独的服务器上遇到问题?