2

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

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

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

谢谢

4

1 回答 1

4

如果 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-entity-to-store 数据。(cms_page_storecms_block_store)。后两个表中的记录不是由它们自己的 ORM 类表示的,而是由它们cms/pagecms/block模型的资源类更新、删除或连接以加载。

同样,是否通过指定的 ORM 类处理 SQL 的决定因素来自业务领域——如果“许多”表中的记录代表业务领域中需要表示或复杂表示的事物,则通过 ORM 访问它们。

于 2012-09-02T12:49:42.420 回答