Laravel Datatables получает ошибку net :: ERR_EMPTY_RESPONSE при добавлении дополнительного столбца - PullRequest
0 голосов
/ 28 мая 2020

Я использую DataTable 1.10.21 с Laravel 7. Я пытаюсь заполнить все данные пользователей, за исключением того, что в моей таблице пользователей есть дополнительный столбец с именем group_id, который определяет группу пользователей (ie. администратор, менеджер, пользователь и т.д. c)

Сейчас моя модель пользователя имеет следующие отношения:

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 имеет ответ), но если я удалю оба столбца, он будет работать нормально.

Пожалуйста, сообщите.

Изменить: 29 мая 2020

Я покопался немного глубже и вот что я нашел:

Если я использую свой локальный тестовый домен (ie. Myproject.test)

  • Если я удалю некоторые другие столбцы (ie. Created at, email), он сработает
  • Если я включу все столбцы (ie. Id, name, group_id, group.name, created_at, email), я получил ошибка ERR_EMPTY_RESPONSE

Если я использую 127.0.0.1:8000

  • , это сработало, даже если я включил все столбцы !!!!

Может кто-нибудь объяснить мне, почему ??

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

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" и т.д. c (то же самое с полями имени).

Yajra - это здорово, но я столкнулся с проблемы с этим и красноречиво себя. Следовательно, почему я просто вернулся к необработанному sql, с тех пор проблем не было.

Редактировать - с новыми данными: Тогда я предлагаю вам опубликовать ваш файл .env, который был загружен в рассматриваемый сервер. Вы делаете все это локально или у вас есть отдельный сервер, на котором возникают проблемы?

0 голосов
/ 02 июня 2020

Если вы используете 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' }
                     ]
            });
         });

...