我有两个ActiveRecord类问题和答案,在db中它们有多对多的关系,所以我有三个表。
问题
| question_id | 名称 |
| 1 |测试问题|
答案
| answer_id | 名称 |
| 1 |首先|
| 1 |第二|
question_answers
| question_id | answer_id | 职位 |
| 1 | 1 | 0 |
| 1 | 2 | 1 |
要在Question类中链接此活动记录,请使用该方法:
public function getAnswers(){
return $this->hasMany(Answer::className(), ['answer_id' => 'answer_id'])
->viaTable('question_answers', ['question_id' => 'question_id']);
}
问题是如何添加"位置"来自db的所有问题的答案问题?
viaTable返回ActiveQuery,但据我所知,你无法添加" position"这里。
怎么做Yii2?是否存在针对此类问题的原生解决方案?或者,如果没有解决方法吗?
P.S。据我所知,这个功能为每个表执行3个查询,它是为一些缓存解决方案而设计的?
答案 0 :(得分:1)
为问题添加position
列,答案位置将存储在多对多表中。
关系可能的解决方法:
Question
型号:
public function getQuestionToAnswers()
{
return $this->hasMany(QuestionToAnswer::className(), ['question_id' => 'question_id'])
->orderBy([QuestionToAnswer::tableName() . 'position' => SORT_ASC]);
}
多对多表格的单独模型QuestionToAnswer
:
public function getAnswer()
{
return $this->hasOne(Answer::className(), ['answer_id' => 'answer_id']);
}
然后,您可以使用每个问题内的排序答案列表来提取整个排序的问题列表。
$questions = Question::find()
->with('questionToAnswers.answer')
->orderBy([Question::tableName() . 'position' => SORT_ASC])
->all();
foreach ($questions as $question) {
foreach ($question->questionToAnswers as $questionToAnswer) {
echo $questionToAnswer->position; // Access position from many-to-many model attributes
echo $questionToAnswer->answer->name; // Access answers attributes
}
}