モデルはCakePHPで複数のテーブルを持つことができますか?
5 に答える
マニュアルのこの文から推測すると:
モデルは通常、データベースへのアクセス ポイントであり、より具体的には、データベース内の特定のテーブルへのアクセス ポイントです。デフォルトでは、各モデルは名前がそれ自体の複数形であるテーブルを使用します。つまり、'User' モデルは 'users' テーブルを使用します。
私はそうは思いませんが、関係を築くことはできるかもしれません。
確かに、同じテーブルがたくさんある場合に便利です。
class SomeModel extends Model
{
var $useTable = false;
public function ReadData()
{
// select table
if($a == 1)
$this->setSource('tableName1');
else if($a == 2)
$this->setSource('tableName2');
// ...
else if($a == N)
$this->setSource('tableNameN');
// now perform operations with selected table
return $this->find('all');
}
}
技術的には、あなたが質問をしている方法に基づいており、私が知っていることではありません。ただし、多くの場合、私はあなたが求めているものに似ているかもしれない何かとの関係を使用します. たとえば、人物には簡単に人物テーブルにドロップできる住所情報がありますが、他のエンティティ (企業など) にも住所がある可能性があるため、通常はそれを引き出すことを好みます。
DB にある種の疑似継承モデルを実装したい場合も同じ考えです。たとえば、ボランティアは人ですが、請負業者、ベンダー、従業員も同じです。すべての人は、人物テーブルに格納したい特定のプロパティと、人物のタイプに固有のその他のプロパティを共有しています。
いずれの場合も 2 つのモデルがありますが、関連付けによってシームレスに連携します。
それがあなたが考えている種類のシナリオである場合、複数のテーブルを持つモデルに関するものではありませんが、同様のアプローチが機能する可能性があります。
データベースにある種の継承を実装したいと思います(子テーブルから情報を取得するときに、親テーブルに格納されているデータを結合する必要があります)。これを解決するための私のアプローチは、子モデルでafterFindコールバックを使用することでした。コールバックを次のように再定義しました。
function afterFind($results) {
foreach ($results as $key => $val) {
$fieldRetrieved=$this->query("SELECT *field* FROM *parent_table* WHERE id={$val['*ChildModelName*']['id']}");
$results[$key]['*ChildModelName*']['*field*']=$fieldRetrieved[0]['*parent_table*']['*field*'];
}
return $results;
}
このようにして、親テーブルのフィールドを子テーブルから取得した結果に含めていました。この場合、両方のテーブルがidというフィールドを持つインデックスであり、子テーブル内のそのフィールドも親テーブルへの外部キーであると想定しました(したがって、疑似継承が作成されます)。