1

ドキュメントとレポートの 2 つのモデルがあります。1 つのドキュメントに 0 個のレポートまたは複数のレポートを含めることができます。1 つのレポートは 0 または 1 つのドキュメントに属します。

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

フィールド document_id はヌルにすることができます。

CGridView ウィジェットを使用してテーブルを表示したいと思います。テーブルには、列「ドキュメント名」と「レポート名」が含まれます。ドキュメントにレポートがない場合は、「ドキュメント名」のみを入力し、「レポート名」は空白のままにします。ドキュメントに 1 つ以上のレポートがある場合、レポートごとに 1 つの行を配置します。例:

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

この方法で CActiveDataProvider を作成しようとしたとき:

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

ドキュメントに複数のレポートがある場合でも、ドキュメントごとに 1 行を取得します。

私がこのようにすると:

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

レポートが 0 件のドキュメントがありません。

これどうやってするの?

4

1 に答える 1

0

CActiveDataProvider の代わりに CSqlDataProvider を使用して解決しました。

于 2016-09-30T14:18:41.790 に答える