0

我有一个项目,我们不存储用户的名称,而只使用他们的用户名进行所有操作。

我发现了一个名为Ticketit的包,它是 Laravel 的帮助台票务系统。

该软件包对所有内容都使用用户名,因此这导致了一些错误。我的模型上有一个getNameAttribute()访问器User,因此在大多数情况下这满足了包,但是有些地方name在 Eloquent::lists()查询中显式调用。

对于这些,我在我自己的这个 repo 的 fork 中手动替换name,并将其链接到我的项目。username

数据表在页面上按预期加载,但是当我尝试按任何其他列排序或在其中运行搜索时,我在开发人员工具的“网络”选项卡中收到 500 个错误。

预览响应显示:

Connection.php 第 662 行中的 QueryException:SQLSTATE [42S22]:找不到列:1054 'where 子句'中的未知列 'users.name'(SQL:选择计数(*)作为聚合来自(row_countticketit内部连接中选择 '1' userson users. id= ticketit. user_idinner join ticketit_statuseson ticketit_statuses. id= ticketit. status_idinner join ticketit_prioritieson ticketit_priorities. id= ticketit. priority_idinner join ticketit_categorieson ticketit_categories. id= ticketit. category_idwhere completed_atis null and (LOWER( ticketit. id) LIKE %%h%% or LOWER( subject) LIKE %%h%% or LOWER( ticketit_statuses. name) LIKE %%h%% 或 LOWER( ticketit. updated_at) LIKE %%h%% 或 LOWER( users. name) LIKE %%h%% 或 LOWER( ticketit_priorities.name) LIKE %%h%% 或 LOWER( users. name) LIKE %%h%% 或 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.nameusers.username,但这并不能解决我的问题。

谁能帮我弄清楚为什么,或者我还需要改变什么,因为我没有运气弄清楚我还需要在哪里改变它。

4

2 回答 2

0

我发现了问题,它是在它调用的 DataTable 的初始化中,users.name而不是users.username.

更新后,清除视图缓存php artisan view:clear一切正常!

于 2016-07-20T08:05:09.023 回答
0

试图编辑 3rd-party 代码试图访问的所有地方,你会发疯的name。我的建议是在根目录下修复,而不是在很多地方打补丁:

  1. 在表中创建一个新nameusers
  2. 用列中的值填充该username

例如查询:

ALTER TABLE `users` ADD COLUMN `name` VARCHAR(30) NOT NULL AFTER `username`; 
UPDATE `users` SET `name` = `username`;

现在您的数据库将具有您的插件期望的架构。

于 2016-07-20T03:56:59.707 回答