有一个名为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);
}
由于一条消息可能会发送给多个用户,因此我创建了一个名为MessageUser
的模型,其中包含每条消息的收件人列表。如下所示(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
的结果是错误的。它可以成功地将作者编写的消息返回给当前用户,但是存在未读消息的问题。这是问题所在:
当前用户ID为2
,矩形中显示的行是用户发送给当前用户的消息。查询
Message::author($author)->receiver($recipient)->get();
返回4
条显示的正确消息,但查询
Message::author($author)->receiver($recipient)->unread()->get();
返回ID为6, 17
的记录。标识为17
的记录是正确的,因为它实际上未被读取,但是标识为6
的记录是错误的。从我观察到的结果中,我发现它返回了错误的结果,因为未读ID为7
的记录!记录message_id
中的6,7,8
28被发送给三个用户。因为至少有一个用户没有阅读过该邮件,所以无论收件人是谁,都始终以未读状态返回该邮件。