簡體   English   中英

使用名稱而不是用戶名的數據表查詢

[英]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內部聯接usersusersid = ticketituser_id內連接ticketit_statusesticketit_statusesid = ticketitstatus_id內部聯接ticketit_prioritiesticketit_prioritiesid = ticketitpriority_id內部聯接ticketit_categoriesticketit_categoriesid = ticketitcategory_id其中completed_at為空和( LOWER( ticketitid )LIKE %%ħ%%或LOWER( subject )LIKE %%ħ%%或LOWER( ticketit_statusesname )LIKE %%ħ%%或LOWER( ticketitupdated_at )LIKE %%ħ%%或LOWER( usersname )LIKE %%ħ%%或LOWER( ticketit_prioritiesname )LIKE %%ħ%%或LOWER( usersname )LIKE %%ħ%%或LOWER( ticketit_categoriesname )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 我的建議是從根本上解決而不是在許多地方打補丁:

  1. users表中創建一個新的name
  2. 在該列中填寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM