0

中間テーブルで表される 2 つのテーブル間に多対多の関係があります。アプリケーションでデータベースをモデル化するために ZF1 テーブル リレーションシップ方法論を使用していますが、これは正常に機能します。私が苦労していることの 1 つは、多対多のルックアップを実行するときに中間テーブルからデータを取得することです。例:

製品テーブル

商品ID、商品名

顧客テーブル

customer_id、customer_name

販売テーブル

customer_id、product_id、date_of_sale

この場合、sales テーブルが中間テーブルであり、多対多の関係が顧客と製品の間にあります。製品と顧客の sales テーブル モデルに referenceMap を追加し、製品テーブル モデルと customer テーブル モデルに依存テーブル "sales" を追加します。

次に、次のコードを使用して、特定の顧客のすべての製品を正常に取得できます (またはその逆)。

$productTable = new productsTable();
$product = $productTable->find(1)->current();


$customers = $product->findManyToManyRowset('customerTable','salesTable');

ただし、返される行セットには「date_of_sale」の値は含まれません。別のデータベース ルックアップを行わずに、中間テーブルの値を含める方法はありますか。zf ドキュメントには何も表示されません。

どんな助けでもいいです。最終的に zend_table を datamapper の実装に置き換えたいと考えています。これは、実行する db クエリの数に関して非常に非効率的であり、複数の単純な選択ではなく、わずかに複雑な SQL 結合クエリを使用して大幅に削減できる可能性がありますが、今のところ行き詰まっていますこれとともに。

ありがとう。

4

1 に答える 1

0

コードで JOIN クエリを使用して、1 回の呼び出しで作成できます。私が理解していることから、このクエリを作成したいと考えています

SELECT p.*, c.*, s.date_of_sale FROM sales AS s
INNER JOIN products AS p ON p.product_id = s.product_id
INNER JOIN customers AS c ON c.customer_id = s.customer_id
WHERE p.product_id = '1';

これを実現するには、複雑な SQL クエリを Zendに参照して、それを Zend_Db クエリに変換する方法を確認するか、次のようなものを使用します。

$select = $this->select()->setIntegrityCheck(false);
$select->from(array('s'=>'sales'), array('date_of_sale'));
$select->join(array('p'=>'products'), 'p.product_id = s.product_id', '*');
$select->join(array('c'=>'customers'), 'c.customer_id = s.customer_id', '*');
$select->where('p.product_id = '.$productId);

明らかに、where 句に quoteInto を使用する方がよいでしょうが、私は怠惰すぎます。

お役に立てれば !

于 2013-07-02T13:20:43.840 に答える