2015-01-22 4 views
0

두 개의 ActiveRecord 클래스 Q & A가 있는데, db에는 다 대 다 관계가 있으므로 세 개의 테이블이 있습니다.yii2 viaTable, 가운데 테이블의 위치 속성

질문
| question_id | 이름 : |
| 1 | 시험 문제 |

대답
| Answer_id | 이름 : |
| 1 | 처음 |
| 1 | 두 번째 |

question_answers
| question_id | Answer_id | 위치 |
| 1 | 1 | 0 |
| 1 | 2 | 1 |

내가 그 방법을 사용하여 질문 클래스에서이 활동 기록을 연결하려면 :

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

문제는 어떻게 질문에 모두 대답을 DB에서 속성을 "위치"를 추가하는 것입니다?
viaTable은 ActiveQuery를 반환하지만 여기서는 "위치"를 추가 할 수 없다는 것을 알고 있습니다. Yii2로 어떻게해야하나요? 이러한 문제에 대한 몇 가지 기본 솔루션이 있습니까? 아니면 이에 대한 몇 가지 해결 방법이 있습니까?

P. 이 기능이 각 테이블에 대해 3 개의 쿼리를 실행한다는 것을 이해 했으므로 일부 캐싱 솔루션을 위해 만들어졌습니다.

답변

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 
    } 
} 
+0

나는 하나의 질문에 많은 답이 있습니다. Anwers가 많은 질문에 속할 수 없다면 그것은 이상 할 것입니다. – JorgeeFG

+0

이러한 질문은 stackOverflow와 같지 않습니다. 위의 테이블 구조를 단순화합니다. 질문에는 다른 질문에서 재사용 할 수있는 답변이있을 수 있습니다. 신경 쓰지 마라. 주요 문제는 "중간 테이블에서 속성을 추가하는 방법"이다. 그러나 내가 이해하는 바에 따르면 그것은 원시 Yii 메커니즘에 의해 해결 될 수 없으므로 asnwer가 정확합니다. –

+0

당신은 확실히 그 질문에 (그 대답은 많은 질문에 속할 수 있음) 언급해야합니다. – arogachev