yii2 viaTable, position 属性 in middle table

yii2 viaTable, position property in middle table

我有两个 ActiveRecord classes 问题和答案,在数据库中它们有多对多关系,所以我有三个 tables.

问题
| question_id | 姓名 |
| 1 |试题 |

回答
| answer_id | 姓名 |
| 1 |第一 |
| 1 |第二 |

question_answers
| question_id | answer_id | 位置 |
| 1 | 1 | 0 |
| 1 | 2 | 1 |

给 link 问题 class 中的这个活动记录 我使用那个方法:

public function getAnswers(){
        return $this->hasMany(Answer::className(), ['answer_id' => 'answer_id'])
                ->viaTable('question_answers', ['question_id' => 'question_id']);
}

问题是如何从数据库中为所有问题答案添加 "position" 属性?
viaTable returns ActiveQuery 但据我了解,您不能在此处添加 "position"。 Yii2怎么做?是否有针对此类问题的本地解决方案?或者,如果没有,是否有一些解决方法?

P.S。据我了解,此功能对每个 table 执行 3 个查询,它是为某些缓存解决方案而设计的吗?

为问题添加position列,答案位置将存储在多对多table。

关系的可能解决方法:

Question 型号:

public function getQuestionToAnswers()
{
    return $this->hasMany(QuestionToAnswer::className(), ['question_id' => 'question_id'])
        ->orderBy([QuestionToAnswer::tableName() . 'position' => SORT_ASC]);
}

多对多 table 的单独模型 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
    }
}