![](/img/trans.png)
[英]INSERT INTO sql query is using variable string rather than field name
[英]Datatable query using name rather than username
我有一个项目,我们不存储用户名,仅将用户名用于所有内容。
我浏览了一个名为Ticketit的软件包,这是Laravel的帮助台票务系统。
该软件包将用户名用于所有内容,因此会导致一些错误。 我的User
模型上有一个getNameAttribute()
访问器,因此在大多数情况下都可以满足该程序包的要求,但是在Eloquent ::lists()
查询中有一些地方明确地调用了name
。
对于这些,我手动在此仓库的自己的fork中用username
替换了name
,并将其链接到我的项目。
数据表将按预期加载,但在尝试按其他任何列进行排序或在其中进行搜索时,开发人员工具的“网络”标签中出现500个错误。
预览响应将显示以下内容:
Connection.php第662行中的QueryException:SQLSTATE [42S22]:找不到列:1054“ where子句”中的未知列“ users.name”(SQL:从集合中选择count(*)作为汇总(从
ticketit
选择“ 1”作为row_count
内部联接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 %%ħ%%或LOWER(subject
)LIKE %%ħ%%或LOWER(ticketit_statuses
。name
)LIKE %%ħ%%或LOWER(ticketit
。updated_at
)LIKE %%ħ%%或LOWER(users
。name
)LIKE %%ħ%%或LOWER(ticketit_priorities
。name
)LIKE %%ħ%%或LOWER(users
。name
)LIKE %%ħ%%或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
。 我的建议是从根本上解决而不是在许多地方打补丁:
users
表中创建一个新的name
列 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
一切正常!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.