Yii2 viaTable, промежуточная таблица с полем position

Есть два класса Question и Answer, по логике у них связь many-to-many, то есть есть три таблицы.

[font="Courier New"]---------------------------------

| question_id | name |


| 1 | Test question |



| answer_id | name |


| 1 | First |

| 1 | Second |

---------------------------------[/font]

…и таблица связка:

[font="Courier New"]--------------------------------------------

| question_id | answer_id | position |


| 1 | 1 | 0 |

| 1 | 2 | 1 |

--------------------------------------------[/font]

Получается, чтобы связать таблицы в Question есть такой метод:


public function getAnswers(){

	return $this->hasMany(Answer::className(), ['answer_id' => 'answer_id'])

		->viaTable('question_answers', ['question_id' => 'question_id']);

}

Вопрос в том, учитывается ли в Yii2 добавление свйоства position для всех Answer определенного Question?

viaTable возвращает класс ActiveQuery, но я так понимаю в него нельзя добавить этот самый position.

Как это решается по-правильному в Yii2? Есть ли какое-то заложенное разработчиками решение или здесь надо использвовать какой-то воркараунд?

Поделитесь опытом, кто делал такую вещь.

P.S. Я так понимаю вся эта логика делает три запроса, для каждой из таблиц, это сделано для какого-то грамотного кеширования?

Сразу хотел бы заметить что лучше для каждой новой сущности использовать поле id, а не question_id или answer_id.

Дела в том что таблица question_answers используется только для получения списка id связанной таблицы чтобы достать из нее данные нужна построить запрос немного по другому.




class Question extends ActiveRecord

{

    public function getQuestionAnswers()

    {

        return $this->hasMany(QuestionAnswer::className(), ['question_id' => 'id']);

    }


//    Этот метод не используется но как пример пускай будет

//    public function getAnswers()

//    {

//        return $this->hasMany(Answer::className(), ['id' => 'answer_id'])

//            ->via('questionAnswers'); // Имя связи которая объявлена выше

//    }

}


class QuestioAnswer extends ActiveRecord

{

    public function getAnswer()

    {

        return $this->hasOne(Answer::className(), ['id' => 'answer_id']);

    }


    public function getQuestion()

    {

        return $this->hasOne(Question::className(), ['id' => 'question_id']);

    }

}


class Answer extends ActiveRecord

{

    public function getQuestionAnswers()

    {

        return $this->hasMany(QuestionAnswer::className(), ['answer_id' => 'id']);

    }

}


/** @var Question[] $model */

$models = Question::find()

    ->where([

        // ...

    ])

    ->with([ 

        // так мы показываем что по мима данных из Question нам ещё понадобятся 

        // данные из таблиц questioAnswers и Answer

        // еще на этапе формирования самого SQL запроса

        'questioAnswers',

        'questioAnswers.answer',

    ])

    ->all();


foreach($models as $model) {

    echo $model->name;


    foreach($model->questioAnswers as $item) {

        echo $item->position;    

        echo $item->answer->name;

    }

}



Ну как-то так ))

А вообще попробуй использовать gii для генерации моделей, если при создании таблиц в mysql добавишь foreign_key, тогда gii сам с генерирует все связи между моделями.