2012-01-17 9 views
0

私はYiiの関係を使用してテーブルからレコードをフェッチする問題に直面しています、- > ID、名前、Roll_Number - Yiiの

私は3つのテーブル

1)学生を持っています

2)テーマ - > ID、名前

3)Students_taken_Subjects - > ID、STUDENT_ID、Subject_ID

は、学生の数が存在していると仮定しています第3のテーブル「Students_taken_Subjects」に格納されている複数の科目を受験し、特定の科目で受験した学生のリストをどのように取り出すことができますか?

数学で勉強した学生のリスト

関係の1つは正しいですが、どのように$ dataProvider変数に結果を得ることができますか?

'Students'=>array(self::HAS_MANY, 'Subjects', 'Student_ID'), 

return array(
'Students'=>array(self::MANY_MANY, 'Subjects', 
'Students_taken_Subjects(student_id, subject_id)'), 
); 

答えて

1

科目と学生がMANY_MANYですが、あなたは間違ってそれを少し書いて、これは何が必要であるとの関係:「あなた一度

class Subjects extends CActiveRecord 
{ 
    // ... 
    public function relations() 
    { 
     return array(
      'Students'=>array(self::MANY_MANY, 'Students', 'Students_taken_Subjects(Subject_ID, Student_ID)'), 
     ); 
    } 
    // ... 
} 

この関係を記述すると、科目のアクティブレコードには、その科目を受講する0人以上の学生がいる配列を返すStudentsプロパティがあります。あなたはこのようにそれらにアクセスすることができます。

$subject = Subjects::model()->findByPk($pk); 
$students = $subject->Students; // an array with the subject's students 

上記のコードは2 DBアクセス、$対象用と関連$学生のための1になります。これはうまくいくかもしれませんが、多くのテーマにアクセスしていると、あまりにも多くの「怠惰な読み込み」が問題になる可能性があります。あなたは「熱心な負荷」は、このような対象者と一緒に生徒のYiiを伝えることができます: - (「学生」)で使用して -

$subjects = Subjects::model()->with('Students')->findAll(); 
ここ

あなたが科目のすべてを見つけることが、Yiiのを警告しているあなたのこと各科目の学生情報も欲しいと思っています。これにより、あなたが見つけた科目に関連するすべての生徒が一度に手に入るようになります。 with()機能の代わりに、基準のwithプロパティを使用することです:

$criteria=new CDbCriteria; 
$criteria->with = array('Students'); 
$subjects = Subjects::model()->findAll($criteria); 

いずれかの方法で、あなたはこのような被験者の学生を求めるないとき:

$subjects[0]->Students; 
$subjects[1]->Students; 
// ... 

あなたはそれぞれ別のDBコールを取得することはありませんYiiはすでにデータを読み込んでいるためです。

詳細については、データ提供者の学生が何をしたいのかについて詳しく説明する必要があります。

関連する問題