Фильтр отношений в котором есть обратный вызов с Eloquent - PullRequest
1 голос
/ 21 марта 2019

С учетом следующих моделей

Разговор : идентификатор, идентификатор_пользователя,

Сообщение : идентификатор, идентификатор_ беседы, идентификатор_пользователя, созданный_ат

Я хотел запросить все разговоры, у которых есть сообщения между $start и $end, поэтому я сделал это:

$filterMessages = function($query) use ($start, $end) {
    $query->whereBetween("created_at", [$start, $end]);
};

$convs = Conversation::whereHas("messages", $filterMessages)
->with(["messages"  => $filterMessages]);

И это работает.Теперь мне нужно добавить условие: message.user_id должен соответствовать user_id его разговора (как в whereHas, так и в with).Поэтому я изменил свой обратный вызов на это:

$filterMessages = function($query) use ($start, $end) {
    $query->whereBetween("created_at", [$start, $end]);
    $query->where("conversations.user_id", "author_id");
};

Но это не работает.Как я могу это сделать?

Спасибо

1 Ответ

1 голос
/ 21 марта 2019

Попробуйте это

Conversation Model определить отношение

public function userMessages()
{
   return $this->hasMany(Message::class, 'author_id', 'user_id'); //your relationship based on data structure
}

$convs = Conversation::whereHas('userMessages',function($query) use ($start, $end) {
                           $query->whereBetween("created_at", [$start, $end]);
                       })
                      ->with("userMessages")
                      ->get();

...