【问题标题】:Laravel Datatables getting net::ERR_EMPTY_RESPONSE error when adding extra columnLaravel Datatables 在添加额外列时出现 net::ERR_EMPTY_RESPONSE 错误
【发布时间】:2020-09-16 06:08:44
【问题描述】:

我在 Laravel 7 中使用 DataTable 1.10.21。我正在尝试填充所有用户数据,除了我的用户表有一个名为 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 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

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

谁能解释一下为什么?

【问题讨论】:

  • $data = User::select("*")-&gt;with('group')-&gt;get() 怎么样...添加 ->get()
  • @Digvijay 试过了,这不起作用。
  • 能否分享一下您的id="table"。编辑后,似乎缺少一些
  • @Digvijay 在第一篇文章中更新。但同样,它与组或组 ID 无关。请看我上面更新的帖子。

标签: php laravel datatables yajra-datatable


【解决方案1】:

如果您使用的是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' }
                     ]
            });
         });

【讨论】:

  • 感谢您的输入,但用户将始终拥有组 ID 和组名。请看我 5 月 29 日的编辑
  • @Josh 是的,但您需要正确映射它。请尝试这种方法,将来您可以删除检查!empty($user-&gt;group) ? $user-&gt;group-&gt;name : ''"$user-&gt;group-&gt;name
【解决方案2】:

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 文件。您是在本地执行所有这些操作,还是在单独的服务器上遇到问题?

【讨论】:

  • 与$data无关。我记录了 $dt 和 $data 都得到了输出。它与测试域有关。请参阅我 5 月 29 日的编辑谢谢
  • 那么我建议您发布已加载到相关服务器的 .env 文件。您是在本地执行所有这些操作,还是在单独的服务器上遇到问题?
  • 谢谢!一旦我在 .env 中将 APP_URL 设置为 myproject.test,它就起作用了!请编辑您的帖子,我会接受您的回答!
  • 完成,更新到底部,同时保留原件,以防万一它帮助其他人。
猜你喜欢
相关资源
最近更新 更多
热门标签