我正在尝试构建一个越来越难的查询...我正在 Laravel 中开发一个聊天应用程序,结构简单:
- 一个聊天有很多消息。
- 并且每条消息都属于一个用户。
- 用户和消息之间的 n:m 以保存已读消息。
所以
聊天.php
public function messages() {
return $this->hasMany(Message::class)
}
消息.php
public function user() {
return $this->belongsTo(User::class);
}
public function reads() {
return $this->belongsToMany(User::class, 'reads');
}
用户.php
public function messages() {
return $this->hasMany(Message::class);
}
public function reads() {
return $this->belongsToMany(Message::class, 'reads');
}
好吧,现在我想要下一个查询
给我所有包含我未读消息的聊天(登录用户)
这意味着这样的事情:
Chat::whereDoesntHave('messages.reads', function (Builder $q) {
return $q->where('user_id', auth()->id());
});
但那是行不通的,因为如果 Chat 有一条我读过的消息,它会被忽略:(
也许我可以通过仅限于聊天的最后一条消息来实现这一点?或者也许我可以进行这样的操作:
- 统计所有聊天消息
- 统计我阅读的所有聊天消息
- 做一个减法,如果不是 0,考虑这个聊天:D
但我不知道如何用 Eloquent 进行“操作”。
请帮忙。谢谢!