使用名称而不是用户名

时间:2016-07-20 03:45:25

标签: php laravel datatables laravel-5.1 laravel-datatables

我有一个项目,我们不存储用户的名称,只使用他们的用户名。

我浏览了一个名为Ticketit的软件包,它是Laravel的帮助台票务系统。

该软件包使用所有内容的用户名,因此导致一些错误。我的getNameAttribute()模型上有一个User访问者,因此大部分内容都满足了这个包,但有些地方在Eloquent name查询中明确调用了::lists()

对于这些内容,我在my own fork of this repo内手动将name替换为username,并将此链接到我的项目中。

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

预览回复显示:

  

Connection.php第662行中的QueryException:   SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'users.name'(SQL:选择count(*)作为聚合(从row_count选择'{'为ticketit内部联接users位于usersid = ticketituser_id内部加入ticketit_statuses ticketit_statusesidticketit status_id = ticketit_prioritiesticketit_priorities内部加入idticketitpriority_id内部加入ticketit_categories。在ticketit_categoriesid = ticketitcategory_id其中completed_at为空且(LOWER(ticketitid)LIKE% %h %%或LOWER(subject)LIKE %% h %%或LOWER(ticketit_statusesname)LIKE %% h %%或LOWER(ticketit。{ {1}})LIKE %% h %%或LOWER(updated_atusers)LIKE %% h %%或LOWER(nameticketit_priorities)LIKE %% h %%或LOWER(nameusers)LIKE %% h %%或LOWER(nameticketit_categories)LIKE %% h %%))count_row_table)< / p>

按照这个帖子的路线,我到name。在原始包中,这是:

TicketController@data

我在fork中编辑了这个:

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,但这并不能解决我的问题。

任何人都可以帮我弄明白为什么,或者我还需要改变什么,因为我没有任何运气可以找出我需要改变的地方。

2 个答案:

答案 0 :(得分:0)

您将尝试编辑第三方代码尝试访问name的所有位置。我的建议是在许多地方修复根而不是补丁:

  1. name表格
  2. 中创建新的users
  3. 使用username
  4. 中的值填充该列

    例如查询:

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

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

答案 1 :(得分:0)

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

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