在Zend模型中使用多个表并返回组合结果集

时间:2009-01-07 16:38:24

标签: php zend-framework

嗨这是一个非常具体或非常通用的问题 - 我不确定,我一般都是Zend框架/ oo的新手。如果这是一个愚蠢的问题,请耐心等待......

无论如何,我想创建一个类似于:

的模型
Read all the itmes from a table 'gifts' into a row set

for each row in the table, read from a second table which shows how many have been bought, the append this as another "field" in the returned row

return the row set, with the number bought included.

大多数简单的Zend示例似乎只在模型中使用一个表,但我的阅读似乎表明我应该在那里完成大部分工作,而不是在控制器中。如果这个问题过于通用,那么使用2个表并返回数组的模型的任何示例都会很棒!

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我假设第二个表是“gift_order”之类的东西。

在这种情况下,您需要通过外键在“gift”和“gift_order”之间指定表关系,并在表类中对其进行描述。

It will look like this

    class GiftOrder extends Zend_Db_Table_Abstract
    {
    /** Table name */
    protected $_name    = 'gif_order';
    protected $_referenceMap = array(
    "Fileset" =>array(
        "columns" => array("gifId"),
        "refTableClass" => "Gift",
        "refColumns" => array("id")
    ));
      ........................

You need to specify foreigh key constraint while create table with SQL
      ALTER TABLE `gift_order`
  ADD CONSTRAINT `order_to_gift` FOREIGN KEY (`giftId`) REFERENCES `gift` (`id`) ON DELETE CASCADE;

如果这是您要找的内容,可以在此链接link http://framework.zend.com/manual/en/zend.db.table.relationships.html

找到更多相关信息

使用这样的解决方案,您将能够循环礼品并获得订单,而无需任何复杂的SQL

$ rowSetGifts = $ this-> findGifts();

while($rowSetGifts->next()){
   $gift = $rowSetGifts->current();
   $orders = $gift->findGiftOrder();//This is magick methods, this is the same $gift->findDependentRowset('GiftOrder');

//现在你可以用订单做什么 - 计数($ orders),循环或编辑

}

答案 1 :(得分:1)

我建议您在礼品模型类中创建一个返回所需内容的函数。它可能看起来像:

public function getGiftWithAdditionalField($giftId) {
  $select = $this->getAdapter()->select()
    ->from(array('g' => 'gifts'))
    ->joinLeft(array('table2' => 't2'), 'g.gift_id = t2.gift_id', array('field' => 'field'))
    ->where('g.gift_id = ?', $giftId);
  return $this->getAdapter->fetchAll($select);
}

您可以查看Zend Framework Docs on Joins了解详情。