0

ユーザーの名前を保存せず、すべてにユーザー名を使用するプロジェクトがあります。

Laravel のヘルプデスク チケット システムであるTicketitというパッケージに出会いました。

パッケージはすべてにユーザーの名前を使用するため、いくつかのエラーが発生しました。私はgetNameAttribute()自分のモデルにアクセサーを持っているので、ほとんどの場合、これはパッケージを満たしていますが、EloquentクエリUserで明示的に呼び出される場所がいくつかありました。name::lists()

これらについては、このレポの自分のフォーク内で手動で置き換えname、これをプロジェクトにリンクしました。username

データテーブルは期待どおりにページに読み込まれますが、他の列で並べ替えたり、その中で検索を実行しようとすると、開発者ツールの [ネットワーク] タブに 500 エラーが表示されます。

応答をプレビューすると、次のようになります。

Connection.php 行 662 の QueryException: SQLSTATE[42S22]: 列が見つかりません: 1054 Unknown column 'users.name' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as row_countfrom ticketitinner join 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_idここで、completed_atは null かつ (LOWER( ticketit. id) LIKE %%h%% または LOWER( subject) LIKE %%h%% または 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.nameましたusers.usernameが、これで問題が解決するわけではありません。

これを変更する必要がある他の場所を見つけることができなかったので、誰かが理由、または他に何を変更する必要があるかを理解するのを手伝ってくれますか?

4

2 に答える 2

0

問題が見つかりました.DataTableの初期化ではusers.nameなく、呼び出していましたusers.username.

これを更新した後、ビューのキャッシュをクリアするphp artisan view:clearと、すべて正常に機能しました!

于 2016-07-20T08:05:09.023 に答える
0

サードパーティのコードがアクセスしようとするすべての場所を編集しようとすると、気が狂いますname。私の提案は、多くの場所にパッチを当てるのではなく、ルートで修正することです:

  1. テーブルに新しいname列を作成するusers
  2. その列に列の値を入力しusernameます

例:

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

これで、プラグインが期待するスキーマが DB に含まれるようになります。

于 2016-07-20T03:56:59.707 に答える