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

sha*_*une 17 php zend-framework magento data-structures

我正在为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>');
   }
} 
Run Code Online (Sandbox Code Playgroud)

另外,我只是注意到,查看数据库模型几乎所有表都有一个主键.我知道这与EAV风格的数据库结构有很大关系,但仍然可以使用带有复合PK的表吗?如果可能的话,我想坚持使用Magento框架/惯例.气馁了吗?我应该只更改自定义表的结构以获得一些虚拟ID列吗?我有能力做到这一点,但是geez!

(我认为我会提到的另一个注意事项是,看起来Zend Framework提供了一种基于复合主键在表上创建类的方法(参见本页的示例#20 - 大约一半),所以它似乎Magento框架也应该提供它...我只是不知道如何.)

Ala*_*orm 29

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

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

  • 艾伦,你的答案总是很出色. (6认同)

小智 6

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

protected function _construct()
{
    $this->_init('salesrule/coupon_usage', '');
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*owe 5

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

/**
 * 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);
Run Code Online (Sandbox Code Playgroud)