Запрос данных с использованием имени, а не имени пользователя

У меня есть проект, в котором мы не храним имя пользователя и просто используем его имя для всего.

Я перебираю пакет под названием Ticketit которая является службой поддержки билетов для Laravel.

Пакет использует имя пользователя для всего, и это вызвало несколько ошибок. у меня есть getNameAttribute() Accessor на моем User модель и так по большей части это удовлетворяет пакет, однако были некоторые места, которые явно name в красноречивом ::lists() запросы.

Для этих я вручную заменил name с username внутри мой собственный форк этого репо, и связать это с моим проектом.

Данные загружаются, как и ожидалось, на странице, но когда я пытаюсь отсортировать по любому из других столбцов или выполнить поиск по нему, я получаю 500 ошибок на вкладке «Сеть» инструментов разработчика.

Предварительный просмотр ответа показывает это:

QueryException в Connection.php строка 662:
SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «users.name» в «предложении where» (SQL: выберите количество (*) в качестве совокупности из (выберите «1» в качестве row_count от ticketit внутреннее соединение users на users,id знак равно ticketit,user_id внутреннее соединение ticketit_statuses на ticketit_statuses,id знак равно ticketit,status_id внутреннее соединение ticketit_priorities на ticketit_priorities,id знак равно ticketit,priority_id внутреннее соединение ticketit_categories на ticketit_categories,id знак равно ticketit,category_id где completed_at является нулевым и (НИЖЕ (ticketit,id) LIKE %% h %% или LOWER (subject) LIKE %% h %% или LOWER (ticketit_statuses,name) LIKE %% h %% или LOWER (ticketit,updated_at) LIKE %% h %% или LOWER (users,name) LIKE %% h %% или LOWER (ticketit_priorities,name) LIKE %% h %% или LOWER (users,name) LIKE %% h %% или LOWER (ticketit_categories,name) LIKE %% h %%)) count_row_table)

Следуя по маршруту, к которому это сообщение, я добираюсь до TicketController@data, В оригинальной упаковке это:

public function data(Datatables $datatables, $complete = false)
{
$user = $this->agent->find(auth()->user()->id);
if ($user->isAdmin()) {
if ($complete) {
$collection = Ticket::complete();
} else {
$collection = Ticket::active();
}
} elseif ($user->isAgent()) {
if ($complete) {
$collection = Ticket::complete()->agentUserTickets($user->id);
} else {
$collection = Ticket::active()->agentUserTickets($user->id);
}
} else {
if ($complete) {
$collection = Ticket::userTickets($user->id)->complete();
} else {
$collection = Ticket::userTickets($user->id)->active();
}
}
$collection
->join('users', 'users.id', '=', 'ticketit.user_id')
->join('ticketit_statuses', 'ticketit_statuses.id', '=', 'ticketit.status_id')
->join('ticketit_priorities', 'ticketit_priorities.id', '=', 'ticketit.priority_id')
->join('ticketit_categories', 'ticketit_categories.id', '=', 'ticketit.category_id')
->select([
'ticketit.id',
'ticketit.subject AS subject',
'ticketit_statuses.name AS status',
'ticketit_statuses.color AS color_status',
'ticketit_priorities.color AS color_priority',
'ticketit_categories.color AS color_category',
'ticketit.id AS agent',
'ticketit.updated_at AS updated_at',
'ticketit_priorities.name AS priority',
'users.name AS owner',
'ticketit.agent_id',
'ticketit_categories.name AS category',
]);
$collection = $datatables->of($collection);
$this->renderTicketTable($collection);
$collection->editColumn('updated_at', '{!! \Carbon\Carbon::createFromFormat("Y-m-d H:i:s", $updated_at)->diffForHumans() !!}');
return $collection->make(true);
}

Который я отредактировал для этого в моей вилке:

public function data(Datatables $datatables, $complete = false)
{
$user = $this->agent->find(auth()->user()->id);
if ($user->isAdmin()) {
if ($complete) {
$collection = Ticket::complete();
} else {
$collection = Ticket::active();
}
} elseif ($user->isAgent()) {
if ($complete) {
$collection = Ticket::complete()->agentUserTickets($user->id);
} else {
$collection = Ticket::active()->agentUserTickets($user->id);
}
} else {
if ($complete) {
$collection = Ticket::userTickets($user->id)->complete();
} else {
$collection = Ticket::userTickets($user->id)->active();
}
}
$collection
->join('users', 'users.id', '=', 'ticketit.user_id')
->join('ticketit_statuses', 'ticketit_statuses.id', '=', 'ticketit.status_id')
->join('ticketit_priorities', 'ticketit_priorities.id', '=', 'ticketit.priority_id')
->join('ticketit_categories', 'ticketit_categories.id', '=', 'ticketit.category_id')
->select([
'ticketit.id',
'ticketit.subject AS subject',
'ticketit_statuses.name AS status',
'ticketit_statuses.color AS color_status',
'ticketit_priorities.color AS color_priority',
'ticketit_categories.color AS color_category',
'ticketit.id AS agent',
'ticketit.updated_at AS updated_at',
'ticketit_priorities.name AS priority',
'users.username AS owner',
'ticketit.agent_id',
'ticketit_categories.name AS category',
]);
$collection = $datatables->of($collection);
$this->renderTicketTable($collection);
$collection->editColumn('updated_at', '{!! \Carbon\Carbon::createFromFormat("Y-m-d H:i:s", $updated_at)->diffForHumans() !!}');
return $collection->make(true);
}

С этим я изменил users.name в users.username, но это не решает проблему для меня.

Может ли кто-нибудь помочь мне понять, почему, или что еще мне нужно изменить, поскольку мне не повезло, выяснить, где еще мне нужно изменить это.

0

Решение

Вы сведете с ума, пытаясь отредактировать все места, где сторонний код пытается получить доступ name, Я предлагаю исправить в корне, а не исправлять во многих местах:

  1. Создать новый name колонка в users Таблица
  2. Заполните этот столбец значениями в username колонка

например, запросы:

ALTER TABLE `users` ADD COLUMN `name` VARCHAR(30) NOT NULL AFTER `username`;
UPDATE `users` SET `name` = `username`;

Теперь ваша БД будет иметь схему, которую ожидает ваш плагин.

0

Другие решения

Я обнаружил проблему, это было в инициализации DataTable, где он вызывал users.name скорее, чем users.username,

После обновления, очистив кеш просмотров php artisan view:clear все работало нормально!

0

По вопросам рекламы [email protected]