Как получить данные в методе из других таблиц? - PullRequest
0 голосов
/ 01 ноября 2018

enter image description here

Это моя простая схема БД. Теперь в моей группе таблиц у меня есть «group_A» и «group_B». В таблице вопросов у меня есть 10 вопросов 5 для group_A и 5 для group_B. Таблица пользователей - это один пользователь с идентификатором = 1. Что я пытаюсь сделать, это получить такие данные:

SELECT answer
FROM answers
JOIN questions q ON (q.id = answer.question_id)
JOIN group g ON (g.id = q.group_id)
WHERE user_id = 1 AND g = 'group_A'

У меня есть модель в классе пользователей, и я хотел бы, чтобы метод create получал ответы в зависимости от группы:

public function getAnswers($group) {
        return $this->hasMany('App\Answers', 'question_id', 'id');
    }

Как я могу получить это в этом методе? Должен ли я создать группу методов в классе вопросов?

1 Ответ

0 голосов
/ 01 ноября 2018

Не уверен, как определить такое отношение в модели, которая принимает входной параметр, но вы можете определить область в вашей модели, чтобы получить ответы, отфильтрованные по группам, например

class Answer extends Model {

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function question()
    {
        return $this->belongsTo('App\Question');
    }

    public function scopeGroup($query, $name)
    {
        return $query->whereHas('question.group', function($q) use($name){
                    $q->where('name', '=', $name);
        });
    }
}

Я предполагаю, что в модели ответов вы определили отношения для вопроса, и аналогично в модели вопросов вы определили отношения для групповой модели.

В построителе запросов вы можете написать это как

$answers = Answer::group('group_A')
                 ->whereHas('user', function($q) use($userid){
                    $q->where('id', '=', $userid);
                 })->get();

Или вы можете применить фильтр к загруженным отношениям как

$users = User::with(['answers' => function($query)
{
    $query->whereHas('question.group', function($q){
        $q->where('name', '=', 'group_A');
    });

}])->get();

Если у вас уже есть объект пользователя, вы можете получить ответы для конкретной группы как

$answers = $user->answers()
                ->whereHas('question.group', function($q){
                    $q->where('name', '=', 'group_A');
            })->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...