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

时间:2010-06-09 18:48:59

标签: php zend-framework data-structures 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风格的数据库结构有很大关系,但仍然可以使用带有复合PK的表吗?如果可能的话,我想坚持使用Magento框架/惯例。气馁了吗?我应该只更改自定义表的结构以获得一些虚拟ID列吗?我确实有能力做到这一点,但是geez!

(我认为我会提到的另一个注意事项是,看起来Zend Framework提供了一种方法,可以使用复合主键(see Example #20 on this page - 大约一半)将类放在一个表上,所以似乎Magento框架也应该提供它......我只是不知道如何。)

4 个答案:

答案 0 :(得分:29)

与大多数Active Record灵感模型一样,Magento的Mage_Core_Model_Abstract并未构建为支持复合主键。从这个基础继承的任何模型(意味着所有这些模型)都继承了这个假设。如果要使用复合主键,则无法使用。您的选择是转到Magento Model路由并创建一个主键(“假”,就像您所说的那样),然后对表应用唯一索引,或使用基本Zend DB表实现您自己的Model层,或者导入系统中支持所需功能的第三方模型解决方案。

就Zend Framework而言,Magento团队使用Zend的Table Gateway Pattern to implement an Active Record style Model layer作为他们的框架。 Zend Framework不是像Cake或Rails这样的应用程序堆栈,它是一个类库集合,可用于构建应用程序堆栈(或应用程序,或许多其他东西)。仅仅因为Zend Framework类支持某些东西并不意味着使用Zend Framework的系统和应用程序可以免费获得它。

答案 1 :(得分:6)

看到magento Model“Mage_SalesRule_Model_Resource_Coupon_Usage”,表'salesrule_coupon_usage'有一个复合/复合主键。就像这样:

this.setLayerType(View.LAYER_TYPE_HARDWARE, paint);

答案 2 :(得分:5)

虽然您可能无法在标准Active Record样式模型中使用复合主键,但可以通过将每个字段设置为主要字段来轻松地在支持数据库迁移中创建复合主键;

/**
 * Create table 'cms/block_store'
 */
$table = $installer->getConnection()
    ->newTable($installer->getTable('cms/block_store'))
    ->addColumn('block_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
        'nullable'  => false,
        'primary'   => true,
        ), 'Block ID')
    ->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
        'unsigned'  => true,
        'nullable'  => false,
        'primary'   => true,
        ), 'Store ID')
    ->addIndex($installer->getIdxName('cms/block_store', array('store_id')),
        array('store_id'))
    ->addForeignKey($installer->getFkName('cms/block_store', 'block_id', 'cms/block', 'block_id'),
        'block_id', $installer->getTable('cms/block'), 'block_id',
        Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
    ->addForeignKey($installer->getFkName('cms/block_store', 'store_id', 'core/store', 'store_id'),
        'store_id', $installer->getTable('core/store'), 'store_id',
        Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
    ->setComment('CMS Block To Store Linkage Table');
$installer->getConnection()->createTable($table);

答案 3 :(得分:1)

我知道这是一个老问题,但我有同样的问题,但在这里我是如何修复的:我添加了所有用逗号分隔的字段:

std::string