添加额外的列时Laravel Datatables出现net :: ERR_EMPTY_RESPONSE错误

时间:2020-05-28 19:25:41

标签: php laravel datatables yajra-datatable

我在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)

  • 如果我删除其他一些列(即在电子邮件中创建的列),则可以正常工作
  • 如果我包括所有列(即id,name,group_id,group.name,created_at,email),则会收到ERR_EMPTY_RESPONSE错误

如果我使用127.0.0.1:8000

  • 即使我包括所有列,它也能正常工作!!!!

有人可以向我解释为什么吗?

2 个答案:

答案 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文件。您是在本地进行所有操作,还是在其他服务器上遇到问题?