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
看到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)
虽然您可能无法在标准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)