Я пытаюсь создать сложный запрос ... Я разрабатываю приложение чата в Laravel, с простой структурой:
- Чат имеет много сообщений.
- И каждое сообщение принадлежит пользователю.
- n: m между пользователями и сообщениями для сохранения прочитанных сообщений.
Итак
Chat.php
public function messages() {
return $this->hasMany(Message::class)
}
Message.php
public function user() {
return $this->belongsTo(User::class);
}
public function reads() {
return $this->belongsToMany(User::class, 'reads');
}
User.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());
});
Но это не работает, потому что если в чате есть только одно прочитанное мною Сообщение, оно игнорируется: (
Может быть, я мог бы достичь этого, просматривая сообщение LAST только в чате? Или, может быть, я могу сделать такую операцию:
- Подсчитать все сообщения в чате
- Подсчитать все сообщения в чате, прочитанные мной
- Сделать вычитание,если не 0, рассмотрите этот чат: D
Но я не знаю, как выполнить эту «операцию» с Eloquent.
Пожалуйста, помогите. Спасибо!