2016-09-29 10 views
1

두 가지 모델이 있습니다 : 문서 및 보고서. 하나의 문서는 0 개 또는 여러 개의 보고서를 가질 수 있습니다. 하나의 보고서는 0 또는 1 개의 문서에 속합니다.Yii. CActiveDataProvider 및 많은 관계가 있습니다

class Document extends CActiveRecord { 
    public function relations() { 
     return array(
      'reports' => array(self::HAS_MANY, 'Report', 'document_id') 
     ); 
    } 
} 

class Report extends CActiveRecord { 
    public function relations() { 
     return array(
      'document' => array(self::BELONGS_TO, 'Document', 'document_id') 
     ); 
    } 
} 

field document_id는 null 일 수 있습니다.

CGridView 위젯을 사용하여 표를 표시하고 싶습니다. 표에는 "문서 이름"및 "보고서 이름"열이 있습니다. 문서에 "문서 이름"만 넣고 "보고서 이름"은 비워 두십시오. 문서에 하나 이상의 보고서가있는 경우 각 보고서에 대해 하나의 행을 넣습니다. 예 :이 방법으로 CActiveDataProvider을 만들려고

+--------+-------------+ 
|Doc name| Report name | 
+--------+-------------+ 
|doc1 |    | 
|doc2 | report1  | 
|doc3 | report2  | 
|doc3 | report3  | 
+--------+-------------+ 

:

$criteria = new CDbCriteria(); 
$criteria->with = [ 
    'reports' => [ 
     'together' => true, 
] 
$params = [ 
    'criteria' => $criteria, 
]; 
$dataProvider = new CActiveDataProvider('Document', $params); 

을 각 문서를 위해 나는이 문서가 여러 보고서가 있더라도, 1 개 행을 얻을.

나는이 방법으로 할 경우 : 0 보고서가 누락과

$criteria = new CDbCriteria(); 
$params = [ 
    'criteria' => $criteria, 
]; 
$criteria->with = [ 
    'document' => [/*...*/], 
] 
$dataProvider = new CActiveDataProvider('Report', $params); 

문서.

어떻게하면됩니까?

답변

0

CActiveDataProvider 대신 CSqlDataProvider를 사용하여 해결되었습니다.