2012-01-17 40 views
0

我面臨的問題,以獲取了使用Yii關係從表中的記錄,如何從數據庫中提取出複雜的結果 - Yii的

我有3個表

1)學生 - > ID,姓名,Roll_Number

2)科目 - >的ID,名稱

3)Students_taken_Subjects - > ID,student_id數據,Subject_ID

假設有學生的數量有在第三個表格「Students_taken_Subjects」中存儲了多個科目,那麼我可以如何取出任何特定科目的學生列表?

例如學生學習數學列表

哪一個來自下面的關係是正確的,我怎樣才能得到結果到$ 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或更多的學生採取該主題。你可以像這樣訪問他們:

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

上面的代碼將導致兩個DB訪問,一個用於$主題,一個用於相關$學生。這可能是好的,但如果你訪問了很多主題,它可能會成爲一個「延遲加載」太多的問題。你可以告訴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; 
// ... 

你不會得到各另一個數據庫調用因爲Yii已經加載了數據。

您需要提供更多關於您希望對數據提供者中的學生做什麼的詳細信息,然後才能提供有關該信息的更多詳細信息。