model_metaアプリケーションで使用されているさまざまなモデルすべてに関するメタデータを含むと呼ばれるテーブルを含むデータベースを使用しています。関連するデータ構造は次のとおりです。
CREATE TABLE model_meta (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(64),
  oo INT(11),
  om INT(11),
  mo INT(11),
  mm INT(11),
  INDEX (name)
);
CREATE TABLE inventory (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  type VARCHAR(255),
  customers_id INT(11)
);
CREATE TABLE customers (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255),
  contact VARCHAR(255)
);
表の列oo、om、mo、およびmmには、model_metaそのモデルが指定された関係 (つまり、1 対 1、1 対多など) を持つ ID のコンマ区切りリストが含まれています。
クライアントがデータを要求すると、要求しているテーブルの名前 (「在庫」など) だけが返されます。そこから、どのような関係が存在するかを判断し、それらのテーブルにクエリを実行して適切な結果セットを返す必要があります。
$input要求されたモデルの名前を含む単一の変数 ( としましょう) が与えられた場合の手順は次のとおりです。
モデル メタデータを取得します。
SELECT model_meta.* FROM model_meta WHERE model_meta.name = $input;関係列 (oo、om、mo、mm) のどれに値が含まれているかを判断します。値のコンマ区切りリストを含めることができることに注意してください。
ステップ 2 の値を使用して、関連するモデルの名前を決定します。例として、 に
mo値のみが含まれているとしましょう$mo。そう:
SELECT model_meta.name FROM model_meta WHERE model_meta.id = $mo;この結果を としましょう
$related。最後に、要求されたテーブルとそれに関連するすべてのテーブルからデータを選択します。1 対 1、1 対多、多対 1、または多対多くの関係。この特定の例では:
疑似 SQL の場合:
SELECT $input.*, $related.* FROM $input LEFT JOIN $related ON ($related.id = $input.$related_id);
このメソッドは 3 つの個別のクエリを使用します。1 つ目は要求されたテーブルに関するメタデータを収集するため、2 つ目は関連するテーブルの名前を収集するため、3 つ目はそれらのテーブルをクエリして実際のデータを返すためです。
私の質問:これらのクエリのいずれかを組み合わせて、その数を 3 から 2 に減らしたり、1 つのクエリに減らしたりするエレガントな方法はありますか?
もちろん、本当の目標は、関連するテーブルからのデータの取得を何らかの方法で自動化することです (クライアントがテーブルがどのように関連しているかを知る必要はありません)。それが目標です。