2017-04-11 10 views
0

私は、ユーザーが管理者と個人的にチャットできる種類の「チャット」システムを持っていますが、 に問題があります。管理パネルで私は (会話)を持っているすべてのユーザーをリストアップする必要があります。私がまだ返信していない人は に赤色にする必要があります。 標準のPHPでこれを実行することができましたが、Laravelでそれを行う方法についての手がかりはありません。各ユーザーの最新の行Laravel

これは私のデータベースです: チャット

+----+-----------------------------------------------------------------------------+--------+-------+------+------+------------+------------+ 
| id | message                  | sender | admin | file | type | created_at | updated_at | 
+----+-----------------------------------------------------------------------------+--------+-------+------+------+------------+------------+ 
| 1 | Heeey!                  |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 2 | Hey.                  |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 4 | Zou ik iets mogen vragen?             |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 5 | Ja, tuurlijk.                |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 6 | Zou u een foto voor mij willen vectoriseren?        |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 7 | Het is een vrij grootte              |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 8 | Dat is geen enkel probleem!             |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 9 | Stuur maar door                |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 10 | <a class='.fileReference' href='/uploads/Foobar/24344cat.jpeg'>cat.jpeg</a> |  1 |  0 | 1 | 1 | NULL  | NULL  | 
| 11 | Bedankt!                 |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 12 | Geen probleem.                |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 13 | e.                   |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 14 | e.                   |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 15 | e.                   |  1 |  0 | 0 | 1 | NULL  | NULL  | 
| 16 | e.                   |  1 |  1 | 0 | 1 | NULL  | NULL  | 
| 17 | e.                   |  2 |  0 | 0 | 1 | NULL  | NULL  | 
| 18 | e.                   |  3 |  0 | 0 | 1 | NULL  | NULL  | 
+----+-----------------------------------------------------------------------------+--------+-------+------+------+------------+------------+ 

ユーザー

+----+---------+---------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ 
| id | name | email   | password              | remember_token | created_at   | updated_at   | 
+----+---------+---------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ 
| 1 | Foobar | [email protected] | $2y$10$xyovyCx32CpbPaiLnKR1o.ls9ydQhupEdMbPyx0Nn2MwOksRAjd0e | NULL   | 2017-04-07 16:05:53 | 2017-04-07 16:05:53 | 
| 3 | Guxguz | [email protected] | $2y$10$fcxZSH9tTFQ8NYRKK46mTuLos3M/vIdzHintrDWhfx5dpteuL4FEG | NULL   | 2017-04-07 21:17:04 | 2017-04-07 21:17:04 | 
| 4 | Sluxsux | [email protected] | $2y$10$l1QdRB7vrkYvwaA4OiMkWeWl5h2l41U4d9yp1uLuWdcp8QuV07APm | NULL   | 2017-04-07 21:21:54 | 2017-04-07 21:21:54 | 
| 6 | Anbob | [email protected] | $2y$10$SO/NsCXmBxGjtsBQmvXrMuUyUb8wjmTE532UaImFqXDxeuGI95hCa | NULL   | 2017-04-07 21:23:20 | 2017-04-07 21:23:20 | 
+----+---------+---------------+--------------------------------------------------------------+----------------+---------------------+---------------------+ 

マイコントローラ:

私は取り戻す何
$users = DB::table('chat') 
     ->select('sender', 'admin', 'name') 
     ->orderBy('chat.admin', 'asc') 
     ->groupBy('sender') 
     ->join('users', 'chat.sender', '=', 'users.id') 
     ->get(); 

[{"sender":"1","admin":"0","name":"Foobar"},{"sender":"3","admin":"0","name":"Guxguz"}] 

Foobarにはadmin = 0と表示されていますが、これは正しくありませんが、 データベースを見ると、Foobarの最新行にadmin = 1と表示されます。

私は基本的に各ユーザの最後の行を取る必要があるので、 とadmin-columnから名前を取得してadmin-columnが0(私は最後ではない)か1(私は最後でした)。

私は注文してみました、別名、最大ID、...しかし、何も働いていません。

ありがとうございます!

+0

すでにモデルとリレーションを定義しましたか? –

+0

いいえ、私がそれをしたら私のコントローラーはどうしたらいいですか? –

答えて

2

問題を解決する方法はいくつかあります。おそらく最も簡単なのは、2つのクエリを実行することです。

まず、ユーザーごとの最高のチャットIDを取得:

$latestChatIds = DB::table('chat') 
    ->groupBy('sender') 
    ->select(DB::raw('max(id) as id')) 
    ->get() 
    ->pluck('id'); 

その後、対応する行を取得するにはwhereIn()にこれらのIDを使用します。

$users = DB::table('chat') 
    ->join('users', 'chat.sender', '=', 'users.id') 
    ->whereIn('chat.id', $latestChatIds) 
    ->select('sender', 'admin', 'name') 
    ->get(); 

ます。また、サブクエリとして最初のクエリを使用することができます2番目のモデル:

$latestChatIds = DB::table('chat') 
    ->groupBy('sender') 
    ->select(DB::raw('max(id)')); 

$users = DB::table('chat') 
    ->join('users', 'chat.sender', '=', 'users.id') 
    ->whereIn('chat.id', $latestChatIds) 
    ->select('sender', 'admin', 'name') 
    ->get(); 
+0

完璧に感謝します!私はサブクエリ解決策を検討しました。 –

関連する問題