У меня есть проект, в котором мы не храним имя пользователя и просто используем его имя для всего.
Я перебираю пакет под названием 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
, но это не решает проблему для меня.
Может ли кто-нибудь помочь мне понять, почему, или что еще мне нужно изменить, поскольку мне не повезло, выяснить, где еще мне нужно изменить это.
Вы сведете с ума, пытаясь отредактировать все места, где сторонний код пытается получить доступ name
, Я предлагаю исправить в корне, а не исправлять во многих местах:
name
колонка в users
Таблицаusername
колонканапример, запросы:
ALTER TABLE `users` ADD COLUMN `name` VARCHAR(30) NOT NULL AFTER `username`;
UPDATE `users` SET `name` = `username`;
Теперь ваша БД будет иметь схему, которую ожидает ваш плагин.
Я обнаружил проблему, это было в инициализации DataTable, где он вызывал users.name
скорее, чем users.username
,
После обновления, очистив кеш просмотров php artisan view:clear
все работало нормально!