Laravel雄辩地按最新的独特条目排序

时间:2018-05-23 14:24:05

标签: php laravel laravel-5 eloquent

我目前正在为私人邮件系统创建一个基本收件箱,如果用户和收件人之间存在邮件,则只显示登录用户与之联系的用户。 (类似于标准即时通讯的工作方式)

我获取此列表的方法是检查消息表以查看两个用户之间是否存在任何消息。如果确实如此,那么在收件箱中列出这个,但由于用户之间会有很多消息,我使用Laravel集合和唯一功能只显示一次收件人。然后,用户可以单击此收件人以查看消息线程。

我遇到的问题是能够按最新消息对此列表进行排序(例如按created_at排序)

我如何按照最新条目的顺序对此进行排序,以便最新消息显示在收件箱列表的顶部。这是我在控制器中使用的代码,用于获取收件人列表并尝试按最新消息排序:

    $messages = collect(Message::where('recipient_id', $user)->orderBy('created_at', 'desc')->get());

    $messagesUnique = $messages->sortBy('created_at')->unique('sender_id');

    $messagesUnique->values()->all();

由于

1 个答案:

答案 0 :(得分:1)

定义你的人际关系:

class Message extends Model
{
    public function sender()
    {
        return $this->belongsTo(User::class, 'sender_id');
    }

    public function recipient()
    {
        return $this->belongsTo(User::class, 'recipient_id');    
    }
}

在用户模型中:

class User extends Authenticable
{
    public function received()
    {
        return $this->hasMany(Message::class, 'recipient_id')->latest();
    }

    public function sent()
    {
        return $this->hasMany(Message::class, 'sender_id')->latest();
    }
}

然后检索邮件:

$user = Auth::user();
$messages = $user->received->unique('sender_id');
$sent = $user->sent->unique('recipient_id');