繁体   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