yii2 viaTable,中间表中的位置属性

时间:2015-01-22 16:48:12

标签: yii2 relation

我有两个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个查询,它是为一些缓存解决方案而设计的?

1 个答案:

答案 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
    }
}