[英]Magento resource model for table with compound primary key
我正在為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提供了一種基於復合主鍵在表上創建類的方法( 參見本頁的示例#20 - 大約一半),所以它似乎Magento框架也應該提供它...我只是不知道如何。)
與大多數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的系統和應用程序可以免費獲得它。
看到magento Model“Mage_SalesRule_Model_Resource_Coupon_Usage”,表'salesrule_coupon_usage'有一個復合/復合主鍵。 就像這樣:
protected function _construct()
{
$this->_init('salesrule/coupon_usage', '');
}
雖然您可能無法在標准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);
我知道這是一個老問題,但我有同樣的問題,但在這里我如何修復它:我添加所有用逗號分隔的字段:
protected function _construct()
{
$this->_init('salesrule/coupon_usage', 'first_field,second_field,...');
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.