Создание запроса, включая метод модели - PullRequest
0 голосов
/ 29 апреля 2020

Я делал запрос, чтобы вернуть всех тех людей, которые ответили на все вопросы в определенном блоке. Мне удалось получить всех пользователей, которые ответили так:

    public function getUsers()
{
                $question_ids = $this->questions->pluck('id');
                return User::query()->whereHas('question_answers', function ($query) use ($question_ids) {
                    $query->whereIn('question_id', $question_ids);
                })->get();
    }

И у меня есть функция, чтобы проверить, ответил ли определенный пользователь на все вопросы в определенном блоке.

public function hasAnsweredAll(User $user)
{
    return (boolean) ($this->questions->count() == $user->question_answers()->whereHas('question', function($query){
        $query->where('question_block_id', $this->id);
        })->count());
}

Теперь я получаю пользователей, которых хочу: как-то с помощью foreach? Я искал net в течение нескольких часов, но не повезло, поэтому любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Вы можете взглянуть на эту статью от Джонатана Рейнинка , он использует подзапросы для решения проблемы, подобной той, которую вы упомянули

Надеюсь, это сработает для вы

0 голосов
/ 30 апреля 2020

Мне удалось найти решение для моей проблемы. Это так просто, и я до сих пор упускал это, когда читал документацию. whereHas () может принимать операцию и int в качестве параметров, поэтому он будет возвращать экземпляры в соответствии с этим.

Вот так:

    public function getUsers()
    {
                $question_ids = $this->questions->pluck('id');
                return User::query()->whereHas('question_answers', function ($query) use ($question_ids) {
                    $query->whereIn('question_id', $question_ids);
                }, '=', $this->questions->count())->get();
    }

Мне даже не нужен метод hasAnsptedAll больше, потому что возвращаются только пользователи, которые ответили на все. Так что вместо foreach это будет выглядеть так:

$users = $question_block->getUsers();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...