我在两个表之间有多对多关系,用中间表表示。我正在使用ZF1表关系方法在我的应用程序中建模数据库,这很好。我正在努力的一件事是在执行多对多查找时从中间表中提取数据。例如:
PRODUCT_ID, PRODUCT_NAME
CUSTOMER_ID, CUSTOMER_NAME
CUSTOMER_ID, PRODUCT_ID, date_of_sale
在这种情况下,销售表是中间表,客户和产品之间的多对多关系。我将referenceMap添加到产品和客户的销售表模型以及依赖表“sales”到产品表模型和客户表模型。
然后,我可以成功使用以下代码获取给定客户的所有产品(反之亦然)。
$productTable = new productsTable();
$product = $productTable->find(1)->current();
$customers = $product->findManyToManyRowset('customerTable','salesTable');
但它不包括返回的行集中的“date_of_sale”值。有没有办法在不使用单独的数据库查找的情况下包含中间表中的值。我在zf文档中看不到任何内容。
任何帮助都会很酷。 我希望最终用数据映射器实现替换zend_table,因为它在执行的数据库查询数量方面看起来非常低效,这可以通过稍微复杂的SQL连接查询而不是多个简单选择来大大减少但是现在我卡住了有这个。
感谢。
答案 0 :(得分:0)
您可以在代码中使用JOIN查询来进行一次调用。据我了解,您想构建此查询
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';
要实现这一点,您可以参考Complex SQL query into 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子句更好,但我太懒了。
希望这有帮助!