我正在为Magento编写一个自定义模块,我需要在两个表之间实现一对多关系。
最简单的解决方案是为每个表创建一个模型并分别保存数据,但我认为这种方法有一些局限性(我更喜欢将数据保存在一个事务中,而不是两个事务中。我希望在加载集合时加载组合数据,ecc)。
处理这种情况的最佳方法是什么?是否可以有一个从多个表中检索数据的模型类?
感谢
如果1-n关系严格来说是数据结构而不是实体结构,那么相邻表就不需要完整的ORM表示。
在核心代码中找到灵感和示例通常是很好的,所以请参考cms/page
和cms/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_page
和cms_block
)——顺便说一句,这是ORM所期望的——但还有其他表包含用于存储数据的cms实体。(cms_page_store
和cms_block_store
)。后两个表中的记录不是由它们自己的ORM类表示的,而是由cms/page
和cms/block
模型的资源类更新、删除或连接以进行加载。
同样,是否通过指定的ORM类处理SQL的决定因素来自业务域——如果"许多"表中的记录表示业务域中需要表示或复杂表示的内容,请通过ORM访问它们。