2

コントローラーには次の基準があります。

    $criteria = new CDbCriteria;
    $criteria->select = 't.*,b.*,c.*';
    $criteria->join = "INNER JOIN tbl_patient_chair b ON b.patient = '0005'
                        INNER JOIN tbl_chair c ON b.chair = c.Serial_No";
    $criteria->condition = "t.client_id = '0005'";

    $model = Patient::model()->findAll($criteria);

    $this->render('view', array(
        'model' => $model
    ));

次に、次のようにして、選択したすべてのデータを取得しようとしています。

foreach ($model as $models)
  print_r($model);

しかし、結果には、2 番目と 3 番目のテーブルのデータがないことがわかります。最初のテーブルのデータは正常に取得されますが、他のテーブルのデータを表示できません。

誰が私が間違っているのか教えてもらえますか?

4

1 に答える 1

1

結合は、リレーションを作成することでYiiで最もよく使用されます。これにより、複雑なクエリを作成する必要がなくなります。

SQLテーブルに外部キーを追加することから始めます(たとえば、椅子に外部キーpatientIdを追加します)

次に、モデルを再生成すると、リレーションが自動追加されたことがわかります(または手動でリレーションを追加できます)。

public function relations()
{

    return array(
        'chairs' => array(self::HAS_MANY, 'chair', 'patientId'),
    );
}

そして、椅子のモデルでは、関係が表示されます

'patient' => array(self::BELONGS_TO, 'patient', 'patientId'),

リレーションを単独で定義すると、クエリされたモデルの値に$ model-> ratioNameとしてアクセスできます。「where」条件で列を使用する場合は、モデル関数で次のクエリを使用します。

$patients=Patient::model()->findAll(array(
                'condition' => "$field like '%$value%'",
                'with'=>array('chairs'),
                'select'=> "*",
                )); 

「with」キーワードは重要であり、クエリに含める関係のリストの配列を取ることができます。クエリ条件は、含まれているすべてのテーブルに適用されます。別のテーブルのフィールドをクエリせず、出力データのみをリンクする必要がある場合は、ここで「with」キーワードをスキップできます。

そして、あなたは患者に割り当てられた椅子に到達することができます

foreach($patients as $patient)print_r($patient->chairs);

ここで説明したような他のアプローチもあります

関係についてもっと知りたい場合は、こちらにアクセスしてください

于 2013-01-04T12:38:45.287 に答える