Laravel - Область запросов в другой модели не работает - PullRequest
0 голосов
/ 23 января 2019

Существует модель с именем 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

текущий идентификатор пользователя 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 отправляется трем пользователям.Поскольку есть хотя бы один пользователь, который его не читал, поэтому всегда возвращает это сообщение как непрочитанное, независимо от того, кто является получателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...