手動結合は使用しないでください。これは、Active Record を使用すると簡単に実行できます。しかし、「段階的なプロセス」全体を提供しても、思ったほどメリットはありません。基本を自分で学び、代わりに特定の質問を考え出す必要があります。この答えがあまりにも紛らわしい場合は、Alfredo が正しいので、続行する前にフレームワークの学習にもっと時間を費やす必要があります。
ステップ 1 : それぞれのモデルでテーブル リレーションを指定します。データベース スキーマが外部キーを使用している場合 (絶対に使用する必要があります)、gii
モデル ジェネレーターはこれらを自動的に決定できます。それ以外の場合は、手動で宣言する必要があります。
/**
* @property Record[] $records
*/
class Student extends CActiveRecord {
// other code...
public function relations() {
return array(
// other relations
array('records', self::HAS_MANY, 'Record', 'stud_id'),
);
}
}
/**
* @property Student $student
*/
class Record extends CActiveRecord {
// other code...
public function relations() {
return array(
// other relations
array('student', self::BELONGS_TO, 'Student', 'stud_id'),
);
}
}
ステップ 2 : コントローラー アクションで Active Record とリレーションを使用します。これは、何をしようとしているかに大きく依存します。
例: 1 人の生徒にすべてのレコードをロードします。アクションでデータを直接出力していることに注意してください。これは悪い考えであり、簡潔にするためにここで使用しています。実際のアプリケーションでは、代わりにこのデータを使用してビューをレンダリングする必要があります。
public function actionStudentInfo($id) {
$student = Student::model()->with('records')->findByPk($id);
if(!$student) {
throw new CHttpException(404, "Student not found!");
}
echo "<h2>Found the requested student with details:</h2>",
"<pre>", htmlspecialchars(print_r($student->attributes, true)), "</pre>";
if(count($student->records)) {
echo "<h3>Student records:</h3>", "<ul>";
foreach($student->records as $record) {
echo "<li><pre>", htmlspecialchars(print_r($record->attributes, true)), "</pre></li>";
}
echo "</ul>";
} else {
echo "<p>Student has no records...</p>";
}
}
これの重要な部分は->with('records')
呼び出しです。Active Record システムに、Student モデルのrecords
リレーション データをクエリに含めるように指示します。Active Record はそのリレーションを読み取り、それをクエリと返された結果に含めます -Student
でRecords
利用可能になります$student->records
(これは配列になります)。
リレーション仕様に含めることができる追加の詳細が多数あります。たとえば、現在、これらのレコードは特定の順序で取得されません。順序を強制したい場合は、 を指定できます'order' => 'field_name ASC'
。
アクティブ レコードの使用法については、Yii ドキュメントで詳しく説明されています:アクティブ レコード、リレーショナル アクティブ レコード。