0

次のコード例があります。

                $dataProvider = new CActiveDataProvider('firstTable', 
                    array('criteria' => array(
                        'select' => 't.firstfield,secondTable.secondfield',
                        'join' => 'join secondTable on secondTable.id=t.secondTable_id',
                    ),
                    'pagination' => array(
                        'pageSize' => 10,
                    ),
                ));
                $results=$dataProvider->getData();

上記のコードを実行した後、firstField (モデル テーブルから - firstTable) はオブジェクトで使用できますが、secondField (結合テーブルから - secondTable) は使用できません。

コードの何が問題なのか、または「選択」オプションが2番目のフィールドを取得しない理由について、誰でも支援できますか?

4

2 に答える 2

6

リレーションの助けを借りてテーブルを結合するためのより良い解決策を持つ CDbCriteria を使用する方が良いでしょう。CDbCriteria で例を示すことができます。

$criteria = new CDbCriteria;
$criteria->select = 'firstfield';
$criteria->with = array('secondTable_relation'=>array('select'=>'secondfield'));
$dataProvider = new CActiveDataProvider('firstTable', 
                    array('criteria' => $criteria,
                    'pagination' => array(
                        'pageSize' => 10,
                    ),
                ));
                $results=$dataProvider->getData();

secondTable_relation は、secondTable とのリレーション名です。

于 2012-06-26T10:13:36.283 に答える
0

コードの何が問題なのか、または「選択」オプションがsecondFieldを取得しない理由について誰かが支援を提供できますか?

答え:

これは、2つのテーブルに関連するフィールド、つまりfirstTableの外部キーを選択していないために発生していますsecondTable_id。だからあなたがそうするなら:

'select' => 't.firstfield,t.secondTable_id,secondTable.secondfield',

secondTableのsecondFieldにアクセスできるようになります。

$singleresultrow->secondTableRelationName['secondField'];// a single result row can be obtained by foreach iteration over $results

ただし、secondFieldにアクセスすると、別のクエリ(遅延読み込み)が発生します。また、返される最初の(遅延前の)オブジェクトには、secondTableオブジェクトが入力されません。

私が考える問題は、デフォルトでyiiが遅延読み込みによって関連フィールドにアクセスするという事実にあります。そのためには、関連する外部キーが、データプロバイダーを作成しようとしているモデルに存在する必要があります。ここではfirstTableであり external_key secondTable_id

于 2012-06-27T06:24:44.517 に答える