2017-04-11 53 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看到的那樣,管理員= 0,但這是不正確的,但是如果你看看 數據庫,你會看到Foobar的最新一行說admin = 1。

我基本上需要採取每個用戶的最後一排,這樣我就可以從那裏獲取 的名字,並看到管理列如果管理員柱爲0(我是不會長久)或1(我是最後)。

我試過命令,distinct,max-id,...但都沒有工作。

謝謝!

+0

您是否已經定義了模型和關係? –

+0

不,如果我這樣做,我將如何製作控制器? –

回答

2

有一些方法可以解決您的問題。在laravel中可能最簡單的是執行兩個查詢。

首先每位用戶可獲得最高聊天ID:

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

然後使用這些ID在whereIn()獲得相應的行:

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

您還可以使用第一個查詢作爲子查詢第二個:

$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

完美謝謝!我使用子查詢解決方案。 –

相關問題