Magento-自定义模型一对多关系

Magento-自定义模型一对多关系,magento,module,one-to-many,Magento,Module,One To Many,我正在为Magento编写一个自定义模块,需要在两个表之间实现一对多关系 最简单的解决方案是为每个表创建一个模型并分别保存数据,但我认为这种方法有一些局限性(我更喜欢在一个事务中保存数据,而不是两个事务中保存数据,我希望在加载集合ecc时加载组合数据) 处理这种情况的最好办法是什么?是否可以有一个模型类从多个表检索数据 谢谢如果1-n关系严格地说是数据构造而不是实体构造,那么相邻表就不需要完整的ORM表示 在核心代码中找到灵感和示例通常是很好的,因此请参考cms/page和cms/block实体

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

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

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


谢谢

如果1-n关系严格地说是数据构造而不是实体构造,那么相邻表就不需要完整的ORM表示

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

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\u page
cms\u block
)-顺便说一句,这是ORM所期望的-但是还有其他表包含cms实体来存储数据。(
cms\u页面存储
cms\u块存储
)。后两个表中的记录不是由它们自己的ORM类表示的,而是由
cms/page
cms/block
模型的资源类更新、删除或连接以进行加载


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

如果1-n关系严格地说是数据构造而不是实体构造,那么相邻表就不需要完整的ORM表示

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

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\u page
cms\u block
)-顺便说一句,这是ORM所期望的-但是还有其他表包含cms实体来存储数据。(
cms\u页面存储
cms\u块存储
)。后两个表中的记录不是由它们自己的ORM类表示的,而是由
cms/page
cms/block
模型的资源类更新、删除或连接以进行加载


同样,是否通过指定的ORM类处理SQL的决定因素来自业务域-如果“多”表中的记录表示业务域中需要表示或复杂表示的内容,请通过ORM访问它们。

一个模型只能允许一个表集合。因此,您需要创建模型,稍后您可以将它们连接起来以获取组合数据。@KalpeshMehta通常是这样,但并不完全正确。许多集合是从多个表中构建的,这些表中加入了数据。请参阅下面的答案。一个模型只能允许一个表集合。因此,您需要创建模型,稍后您可以将它们连接起来以获取组合数据。@KalpeshMehta通常是这样,但并不完全正确。许多集合是从多个表中构建的,这些表中加入了数据。请看下面我的答案。很高兴知道@benmarks。顺便说一句,你知道为什么它会在保存后处理插入/更新到cms_page_store中,但对于删除,它会在删除前将代码放入(尽管我认为这不会影响结果)。对不起,如果有点不合适的话topic@ivantedja在
\u afterSave()
的情况下,它与CMS实体(id)可用于实体存储外键有关。对于
\u beforeDelete()
实现,我不确定,因为删除
cms\u块
实体数据将基于外键约束删除
cms\u块存储
数据。这是在CE1.6中添加的,可能与EE间接相关,但我不确定。这是一个公平的问题,是杰曼。很高兴知道@benmarks。顺便说一句,你知道为什么它会在保存后处理插入/更新到cms_page_store中,但对于删除,它会在删除前将代码放入(尽管我认为这不会影响结果)。对不起,如果有点不合适的话topic@ivantedja在
\u afterSave()
的情况下,它与CMS实体(id)可用于实体存储外键有关。对于
\u beforeDelete()
实现,我不确定,因为删除
cms\u块
实体数据将基于外键约束删除
cms\u块存储
数据。这是在CE1.6中添加的,可能与EE间接相关,但我不确定。这是一个公平的问题,杰曼。