2016-09-29 4 views
1

J'ai deux modèles: Document et Rapport. Un document peut contenir 0 ou plusieurs rapports. Un rapport appartient à 0 ou 1 Document.Yii. CActiveDataProvider et a de nombreuses relations

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') 
     ); 
    } 
} 

Le champ document_id peut être nul.

Je voudrais afficher la table en utilisant le widget CGridView. Le tableau contient les colonnes "nom du document" et "nom du rapport". Si le document n'a pas de rapport, mettez seulement "nom du document" et laissez "nom du rapport" vide. Si le document comporte un ou plusieurs rapports, placez une ligne pour chaque rapport. Exemple:

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

Quand j'ai essayé de créer CActiveDataProvider de cette façon:

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

Pour chaque document, j'obtenir 1 rang, même si le document a plusieurs rapports.

Si je fais de cette façon:

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

documents avec 0 rapports manquent.

Comment est-ce que je peux faire ceci?

Répondre

0

Résolus en utilisant CSqlDataProvider au lieu de CActiveDataProvider.