Laravel-其他模型中的查询范围不起作用

时间:2019-01-23 07:49:46

标签: laravel laravel-5

有一个名为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的结果是错误的。它可以成功地将作者编写的消息返回给当前用户,但是存在未读消息的问题。这是问题所在:

enter image description here

当前用户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被发送给三个用户。因为至少有一个用户没有阅读过该邮件,所以无论收件人是谁,都始终以未读状态返回该邮件。

0 个答案:

没有答案