データのある2つのテーブルがあり、両方のテーブルからデータを取得して1つのビューに表示する必要があります。
両方のテーブルのフィールドを保持する1つのXMLファイルがあります。
モデルの関数「getForm」は、XMLからすべてのフィールドをロードし、フォームにHTML要素をロードできます。
問題は、関数 'getItem'が1つのテーブルからのみデータを取得でき、他のテーブルからは取得できないことです。関数「getTable」は最初のテーブルに関連付けられているため、最初のテーブルからのデータのみを取得すると思います。
GetItem内の2番目のテーブルからデータをロードするにはどうすればよいですか?
モデルクラスで、次のようにgetItemメソッドをオーバーライドします。
public function getItem() {
$item = parent::getItem();
$item->second_table = $this->getSecondTable($item->second_table_foreign_key);
$item->third_table = $this->getThirdTable($item->third_table_foreign_key);
return $item;
}
ここで重要なのは、特に何らかの種類のキャッシュが有効になっている場合は、バックグラウンドで多くのことが行われているため、親クラスgetItemを呼び出すことです。これで、ビューがない場合でも、セカンダリテーブルのモデルとテーブルクラスを設定する必要があります。このようにして、ヘルパーメソッドから関連データを簡単にロードできます。
private function getSecondTable($id) {
$model = JModelLegacy::getInstance('SecondTable','MyComponentModel');
$table = $model->getTable('SecondTable', 'MyComponentTable');
return $table->load($id);
}
フォームのxml定義フィールド名が2番目と3番目のテーブルの実際の列名と一致していることが重要です。最後に、saveイベントの逆を行う必要があります。ここでも、モデルのsaveメソッドをオーバーロードします。
public function save($data) {
$this->saveSecondTableData($data);
$this->saveThirdTableData($data);
parent::save($data);
}
ヘルパーメソッドで再度テーブルクラスを使用して保存できます。
private function saveSecondTableData($data) {
$model = ModelLegacy::getInstance('SecondTable','MyComponentModel');
$table = $model->getTable('SecondTable', 'MyComponentTable');
$table->bind($data);
$table->store();
parent::save($data);
}
さて、これは非常に骨のない例であり、私が残してきたデューデリジェンスはたくさんあります。エラーチェック、サーバーサイドフォーム検証、テーブルバインド、イベントのロードと保存、アラートの表示など。
また、これは、DBに保存される補助テーブルデータの変更を保存することを想定しています。必要なのがデータを表示することだけであれば、getListQuery()モデルメソッドの左結合はすぐにソートされます。
ただし、複数のテーブルを単一のビューに接続するための基本的な概念はそこにあります。