2016-07-20 10 views
0

私は、ユーザーの名前を格納せず、すべてのユーザー名を使用するプロジェクトがあります。ユーザー名ではなく名前を使用したデータ型クエリ

私はLaravelのためのヘルプデスクチケットシステムであるTicketitと呼ばれるパッケージを利用しています。

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

私は手動でnameusernameに置き換えてmy own fork of this repoの中に入れ、これを私のプロジェクトまでリンクしてください。

データテーブルがページ上にロードされますが、他の列で並べ替えたり、内部で検索を実行しようとすると、開発者ツールの[ネットワーク]タブに500のエラーが表示されます。 Connection.phpラインにおける

QueryException 662:応答をプレビュー

この示し SQLSTATE [42S22]:見つからないカラム:1054不明な列 'users.name '句'(SQLで: SELECT COUNT(*)を選択し(から骨材として '1' としてrow_countticketitから内側usersusersに加わる。id = ticketituser_id内側ticketit_statusesticketit_statusesに加わる。id = ticketitstatus_id内側がにticketit_prioritiesに参加します。 id = ticketitpriority_id内部結合ticketit_categoriesticketit_categoriesです。 id = ticketitcompleted_atは%%時間%%以下(ticketit_statuses LIKE %%時間%%以下(subject)LIKE)ヌルと(ticketit(LOWER。idあるcategory_idname)%%時間%%以下(ticketit LIKE。updated_at)時間%%以下(usersname)%%時間%%以下(ticketit_prioritiesname)LIKE %%時間%%以下(usersname)%%時間%%以下(ticketit_categories LIKE LIKE %% LIKE。この記事は、私が[email protected]に着くルート後の%% %% H))count_row_table)

LIKE name)。私はフォークでこれに編集した

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に変更されているが、これは問題のために固定されていないオリジナルのパッケージでは、これは、私。

私はこれを変更する必要があるかどうかを調べるために何か幸運を覚えていないので、誰かがなぜ変更する必要があるのか​​を理解できますか?

答えて

0

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

  1. 例えばクエリusername

の値と、その列を記入usersテーブル

  • に新しいname列を作成します。 :

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

    DBには、プラグインが期待するスキーマがあります。

  • +0

    私はこれを行うことができましたが、これはルート修正よりもパッチのほうが多いようです。私が言ったように、アクセサーは99%のケースで 'name 'の要求を解決します。これまでに 'name'を明示的に探しているところは3つしかなく、これをusernameに変更しました。私は今から 'name'のクエリをどこから取得しているのか把握しようとしており、完全に動作します。私が絶対に必要な場合はこれを使用しますが、1つのパッケージのためにそれを行う必要があることは無意味なようです。 – James

    0

    問題が見つかりました。それはusers.usernameではなくusers.nameを呼び出すDataTableの初期化にありました。

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

    関連する問題