具有复合主键的表的 Magento 资源模型

我正在为Magento电子商务网站创建自定义模块,该模块将围绕一个具有复合/复合主键的新(即自定义)表,或者更确切地说,该表具有构成主键的两列。有没有人知道如何基于具有复合键的表创建模型/资源模型?

为了提供更多详细信息,我查找了几个教程,并使用了出色的moduleCreator脚本。但似乎所有的教程都围绕着一个PK的表,其中只有一列。像这样:

class <Namespace>_<Module>_Model_Mysql4_<Module> extends Mage_Core_Model_Mysql4_Abstract {
   public function _construct(){
        $this->_init('<module_alias>/<table_alias>', '<table_primary_key_id>');
   }
} 

另外,我刚刚注意到,在数据库模型中,几乎所有的表都有一个主键。我知道这与EAV风格的db结构有很大关系,但是仍然可以使用具有复合PK的表吗?如果可能的话,我想坚持使用Magento框架/惯例。是否气馁?我是否应该只更改自定义表的结构以包含一些虚拟 ID 列?我确实有能力做到这一点,但是天哪!

(我想我会提到的另一个旁注是,看起来Zend框架提供了一种将类基于复合主键的表的方法(请参阅此页面上的示例#20 - 大约在一半),因此似乎Magento框架也应该提供它...我只是不明白该怎么做。


答案 1

像大多数Active Record启发的模型一样,Magento的模型在构建时并没有考虑到对复合主键的支持。从此基础继承的任何模型(即所有模型)都继承此假设。如果要使用复合主键,则无法使用。您的选择是走Magento Model路线并创建单个主键(您称之为“假”),然后将唯一索引应用于表,或者使用基本的Zend DB表实现您自己的模型层,或者将第三方模型解决方案导入到支持所需功能的系统中。Mage_Core_Model_Abstract

就Zend Framework而言,Magento团队使用Zend的表网关模式为其框架实现Active Record样式模型层。Zend Framework不是像Cake或Rails那样的应用程序堆栈,它是可用于构建应用程序堆栈(或应用程序,或许多其他东西)的类库的集合。仅仅因为 Zend Framework 类中支持某些内容并不意味着使用 Zend Framework 的系统和应用程序可以免费获得它。


答案 2

看到洋红色模型“Mage_SalesRule_Model_Resource_Coupon_Usage”,表“salesrule_coupon_usage”有一个复合/复合主键。它是这样的:

protected function _construct()
{
    $this->_init('salesrule/coupon_usage', '');
}

推荐