ユーザーの名前を保存せず、すべてにユーザー名を使用するプロジェクトがあります。
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_count
fromticketit
inner joinusers
onusers
.id
=ticketit
.user_id
inner jointicketit_statuses
onticketit_statuses
.id
=ticketit
.status_id
inner jointicketit_priorities
onticketit_priorities
.id
=ticketit
.priority_id
inner jointicketit_categories
onticketit_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
が、これで問題が解決するわけではありません。
これを変更する必要がある他の場所を見つけることができなかったので、誰かが理由、または他に何を変更する必要があるかを理解するのを手伝ってくれますか?