【问题标题】:Get thread of conversations including the last message using laravel relationship使用 laravel 关系获取对话线程,包括最后一条消息
【发布时间】:2019-12-26 03:51:42
【问题描述】:

我在尝试使用模型关系获取每个对话的最后一条消息和未读消息的数量时遇到问题:

|id | user_id | recipient_to |    message        | read | created_at | updated_at | 
+---+---------+--------------+-------------------+------+------------+------------+
| 1 |    1    |      2       | Hi                |  1   |            |            |
| 2 |    2    |      1       | How are you?      |  1   |            |            |   
| 3 |    1    |      3       | Hi                |  0   |            |            |
| 4 |    1    |      2       | Could you help me?|  0   |            |            |   

我已经构建了检索特定用户的对话线程的查询,包括与收件人的关系:

模型:App\Models\Message.php

public function userTo()
{
   return $this->belongsTo('App\Models\User', 'recipient_to', 'id');
}

控制器

$conversations = Message::where('user_id', 1)
     ->with([
        'userTo' => function ($query) {
            $query->select('id', 'name', 'last_name', 'avatar');
         }
     ])
     ->distinct()
     ->get(['recipient_to']);

回复:

[
    {
        "recipient_to": 2,
        "user_to": {
            "id": 2,
            "name": "Jessyca",
            "last_name": "Skiles",
            "avatar": "https://i.pravatar.cc/150?u=hayes.rachael@example.org"
        }
    },
    {
        "recipient_to": 3,
        "user_to": {
            "id": 3,
            "name": "Rocio",
            "last_name": "Rosenbaum",
            "avatar": "https://i.pravatar.cc/150?u=yspencer@example.org"
        }
    }
]

如何建立返回最后一条消息和未读消息数的关系?

我已经看过这篇文章了,我觉得很有趣,虽然目的是研究 Laravel 的关系 Get latest message (row) per user in Laravel

21/08/2019 --- 进展

如果我在用户模型中创建两个关系,我会收到对话中每个用户发送的最后一条消息,有没有办法创建一个额外的关系并合并以返回最新的?

public function latestMessageTo()
{
   return $this->hasOne('App\Models\Message', 'recipient_to')->orderBy('created_at', 'desc')->latest();
}

public function latestMessageFrom()
{
   return $this->hasOne('App\Models\Message', 'user_id')->orderBy('created_at', 'desc')->latest();
}

【问题讨论】:

    标签: php laravel eloquent-relationship


    【解决方案1】:

    我找到了一个解决方案,不要使用 eloquent,但是它可以满足需要。

    也许我们可以使用 eloquent 找到解决方案,尽管我已经读到使用原生 SQL 查询而不是 eloquent 更有效。

             DB::select('
                SELECT t1.*
                FROM messages AS t1
                INNER JOIN
                (
                    SELECT
                        LEAST(user_id, recipient_to) AS user_id,
                        GREATEST(user_id, recipient_to) AS recipient_to,
                        MAX(id) AS max_id
                    FROM messages
                    GROUP BY
                        LEAST(user_id, recipient_to),
                        GREATEST(user_id, recipient_to)
                ) AS t2
                    ON LEAST(t1.user_id, t1.recipient_to) = t2.user_id AND
                       GREATEST(t1.user_id, t1.recipient_to) = t2.recipient_to AND
                       t1.id = t2.max_id
                    WHERE t1.user_id = ? OR t1.recipient_to = ?
                ',[auth()->guard('api')->user()->id, auth()->guard('api')->user()->id]);
    

    有什么意见吗?

    我要感谢我发现查询的出版物:https://laracasts.com/discuss/channels/laravel/get-the-latest-message-of-chat-model-with-mysql-just-cannot-get-the-idea-how-to-do-this?page=1#reply=392529

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 2016-03-24
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2019-05-10
      相关资源
      最近更新 更多