![](/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.