Существует модель с именем Message
следующим образом (user_id
является отправителем сообщения):
class Message extends Model
{
protected $fillable = ['title', 'body', 'visible', 'message_type_id', 'user_id'];
public function user()
{
return $this->belongsTo('Modules\User\Entities\User', 'user_id');
}
public function user_messages() // recipients
{
return $this->hasMany('Modules\Message\Entities\MessageUser', 'message_id');
}
public function scopeReceiver($query, $user_id)
{
return $query->whereHas('user_messages', function($q) use ($user_id){
$q->receiver($user_id);
});
}
public function scopeUnread($query)
{
return $query->whereHas('user_messages', function ($q){
$q->unread();
});
}
public function scopeAuthor($query, $user_id)
{
return $query->where("user_id", $user_id);
}
Поскольку сообщение может быть отправлено нескольким пользователям, я создал модель с именем * 1006.* который содержит список получателей каждого сообщения.это выглядит следующим образом (столбец read
является логическим):
class MessageUser extends Model
{
protected $fillable = ['message_id', 'user_id', 'read'];
protected $table = "message_user";
public function user()
{
return $this->belongsTo('Modules\User\Entities\User', 'user_id');
}
public function scopeReceiver($query, $user_id)
{
return $query->where('user_id', $user_id);
}
public function scopeUnread($query)
{
return $query->where('read', 0);
}
public function scopeTheMessage($query, $message_id)
{
return $query->where('message_id', $message_id);
}
public function message()
{
return $this->belongsTo('Modules\Message\Entities\Message', 'message_id');
}
}
Мне нужно получить непрочитанные сообщения, отправленные конкретным пользователем текущему пользователю.Это код, который я написал, который не работает
public function unreadMessages($user_id)
{
$author = $user_id;
$recipient = $this->user->id;
dd(Message::author($author)->receiver($recipient)->unread()->get());
$count = Message::author($author)->receiver($recipient)->unread()->count();
return $count;
}
Результат dd
неверен.Он успешно возвращает сообщения, написанные автором текущему пользователю, но у него есть проблема с непрочитанными сообщениями.Вот проблема:
![enter image description here](https://i.stack.imgur.com/zfbzC.png)
текущий идентификатор пользователя 2
, а строки, показанные в прямоугольнике, являются сообщениями, отправленными пользователем текущему пользователю.Запрос
Message::author($author)->receiver($recipient)->get();
возвращает 4
показанных сообщений, что верно, но запрос
Message::author($author)->receiver($recipient)->unread()->get();
возвращает записи с идентификатором 6, 17
.Запись с идентификатором 17
является правильной, поскольку она на самом деле не прочитана, но запись с идентификатором 6
неверна.Из того, что я заметил, я обнаружил, что он возвращает неправильный результат, потому что запись с идентификатором 7
непрочитана!message_id
28 в записях 6,7,8
отправляется трем пользователям.Поскольку есть хотя бы один пользователь, который его не читал, поэтому всегда возвращает это сообщение как непрочитанное, независимо от того, кто является получателем.