Magento - 定制模型一对多的关系

时间:2012-09-02 08:25:01

标签: magento module one-to-many

我正在为Magento编写一个自定义模块,我需要在两个表之间实现一对多的关系。

最简单的解决方案是为每个表创建一个模型并单独保存数据,但我认为这种方法有一些限制(我更喜欢在单个事务中保存数据而不是两个,我想在加载时加载组合数据集合,ecc)。

处理这种情况的最佳方法是什么?是否有可能有一个模型类从多个表中检索数据?

谢谢

1 个答案:

答案 0 :(得分:5)

如果1-n关系严格地是数据结构而不是实体构造,则不需要对相邻表进行完整的ORM表示。

在核心代码中找到灵感和示例通常很好,所以请参考cms/pagecms/block实体,特别是他们的资源模型。以Mage_Cms_Model_Resource_Page::_getLoadSelect()方法为例,因为资源模型调用此方法来加载数据:

protected function _getLoadSelect($field, $value, $object)
{
    $select = parent::_getLoadSelect($field, $value, $object);

    $storeId = $object->getStoreId();
    if ($storeId) {
        $select->join(
                    array('cps' => $this->getTable('cms/page_store')),
                    $this->getMainTable().'.page_id = `cps`.page_id'
                )
                ->where('is_active=1 AND `cps`.store_id IN (' . Mage_Core_Model_App::ADMIN_STORE_ID . ', ?) ', $storeId)
                ->order('store_id DESC')
                ->limit(1);
    }
    return $select;
}

注意连接,并注意它们分别有一个实体表(cms_pagecms_block) - 顺便说一下,这是ORM所期望的 - 但是还有其他表包含cms - 实体到商店的数据。 (cms_page_storecms_block_store)。后两个表中的记录不是由它们自己的ORM类表示,而是由cms/pagecms/block模型的资源类更新,删除或加入它们。

同样,关于是否通过指定的ORM类处理SQL的决定性因素来自业务域 - 如果“许多”表中的记录表示需要在业务域中进行表示或复杂表示的事物,请通过ORM访问它们