Laravel通过多列分组获得最新记录

时间:2019-08-01 16:46:23

标签: php mysql laravel laravel-5 eloquent

你好,我是Laravel的新手,我陷入了Laravel雄辩的复杂查询中

这是我的邮件表格结构

---|-----------|-------------|--------
ID | sender_id | receiver_id | message
---|-----------|-------------|--------
 1 |   1       |   2         | Hello 
 2 |   1       |   2         | Hey hello reply
 3 |   2       |   1         | Good
 4 |   3       |   2         | Hey GOOD Morning
 5 |   3       |   2         | good night

我想从消息表中检索最近的聊天记录,无论是用户还是发件人或接收者,我都想使用groupBy使用多列检索,并且只显示最近一条消息。

喜欢用户2(发送者或接收者)

-----------|-------------|---------------
 sender_id | receiver_id | message
-----------|-------------|---------------
   2       |   1         | Good
   3       |   2         | good night

这是我雄辩的查询

$user = auth()->user(); //User_id 2 based on logged in user either sender or reciever
Message::where('user_id', $user->id)
        ->orWhere('receiver_id', $user->id)
        ->select('user_id','receiver_id')
        ->groupBy('user_id','receiver_id')
       ->get();

结果

all: [
   App\Models\Message {
        user_id: 1,
        receiver_id: 2,
   }, // don't want this record
   App\Models\Message {
        user_id: 2,
        receiver_id: 1,
   },
   App\Models\Message {
        user_id: 3,
        receiver_id: 2,
   },
],

如果我尝试使用Latest()方法,则表明表中存在错误时间戳记

  

Illuminate / Database / QueryException,消息为'SQLSTATE [42000]:

     

语法错误或访问冲突:1055 ORDER BY子句的表达式#1不在GROUP BY子句中,并且包含未聚合的列

我不想在mysql_strict中更新config/database.php模式

它不能正常工作,任何人都可以帮我或任何好的建议或想法

任何帮助都会感激

1 个答案:

答案 0 :(得分:1)

您能找出如何在Laravel中表达这一点吗?

**Schema (MySQL v5.7)**

CREATE TABLE my_table
(ID SERIAL PRIMARY KEY
,sender_id INT NOT NULL
,receiver_id INT NOT NULL
,message VARCHAR(50) NOT NULL
);

INSERT INTO my_table VALUES
(1,1,2,'Hello'),
(2,1,2,'Hey hello reply'),
(3,2,1,'Good'),
(4,3,2,'Hey GOOD Morning'),
(5,3,2,'good night');

---

**Query #1**

SELECT a.*
  FROM my_table a
  JOIN
     ( SELECT MAX(id) id
         FROM my_table
        WHERE 2 IN(sender_id,receiver_id)
        GROUP
           BY LEAST(sender_id,receiver_id)
            , GREATEST(sender_id,receiver_id)
     ) b
    ON b.id = a.id;

| ID  | sender_id | receiver_id | message    |
| --- | --------- | ----------- | ---------- |
| 3   | 2         | 1           | Good       |
| 5   | 3         | 2           | good night |

---

View on DB Fiddle