我有一个项目,我们不存储用户的名称,只使用他们的用户名。
我浏览了一个名为Ticketit的软件包,它是Laravel的帮助台票务系统。
该软件包使用所有内容的用户名,因此导致一些错误。我的getNameAttribute()
模型上有一个User
访问者,因此大部分内容都满足了这个包,但有些地方在Eloquent name
查询中明确调用了::lists()
。
对于这些内容,我在my own fork of this repo内手动将name
替换为username
,并将此链接到我的项目中。
数据表在页面上按预期加载,但是当我尝试按任何其他列排序或在其中运行搜索时,我在开发人员工具的“网络”选项卡中收到500个错误。
预览回复显示:
Connection.php第662行中的QueryException: SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'users.name'(SQL:选择count(*)作为聚合(从
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
为空且(LOWER(ticketit
。id
)LIKE% %h %%或LOWER(subject
)LIKE %% h %%或LOWER(ticketit_statuses
。name
)LIKE %% h %%或LOWER(ticketit
。{ {1}})LIKE %% h %%或LOWER(updated_at
。users
)LIKE %% h %%或LOWER(name
。ticketit_priorities
)LIKE %% h %%或LOWER(name
。users
)LIKE %% h %%或LOWER(name
。ticketit_categories
)LIKE %% h %%))count_row_table)< / p>
按照这个帖子的路线,我到name
。在原始包中,这是:
TicketController@data
我在fork中编辑了这个:
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
,但这并不能解决我的问题。
任何人都可以帮我弄明白为什么,或者我还需要改变什么,因为我没有任何运气可以找出我需要改变的地方。
答案 0 :(得分:0)
您将尝试编辑第三方代码尝试访问name
的所有位置。我的建议是在许多地方修复根而不是补丁:
name
表格users
列
username
列例如查询:
ALTER TABLE `users` ADD COLUMN `name` VARCHAR(30) NOT NULL AFTER `username`;
UPDATE `users` SET `name` = `username`;
现在,您的数据库将具有插件所期望的架构。
答案 1 :(得分:0)
我发现了这个问题,它是在DataTable初始化时调用users.name
而不是users.username
。
更新后,清除视图缓存php artisan view:clear
一切正常!