2010-06-09 30 views
16

我正在創建一個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列?我有能力做到這一點,但geez! (我想我會提到的另一個方面是,它看起來像Zend框架提供了一種方法來基於複合主鍵表(see Example #20 on this page - 大約中途下降)的類,所以它似乎Magento框架也應該提供它......我只是不明白如何。)

回答

27

與大多數活動記錄靈感模型一樣,Magento的Mage_Core_Model_Abstract沒有考慮到對複合主鍵的支持。任何從這個基礎繼承的模型(意味着所有這些模型)都會繼承這個假設。如果你想使用複合主鍵,你將無法使用。你的選擇是去Magento模型路由並創建一個主鍵(如你所說的那樣「僞造」),然後對該表應用一個唯一索引,或者使用基本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的系統和應用程序可以免費獲得它。

+5

艾倫,你答案總是非常出色。 – shaune 2010-06-09 21:58:15

4

儘管您可能無法在標準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); 
5

看到的magento模型「Mage_SalesRule_Model_Resource_Coupon_Usage」時,表 'salesrule_coupon_usage' 具有化合物/複合主鍵。它是這樣的:

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

我知道這是一個老問題,但我有同樣的問題,但在這裏我如何固定它:我添加了所有用逗號分隔的字段:

protected function _construct() 
{ 
    $this->_init('salesrule/coupon_usage', 'first_field,second_field,...'); 
} 
+0

這隻有在保存具有主值的對象時纔有效。它顯然沒有幫助加載或刪除。標準資源模型並不是以這種方式設計的,只是運氣好一點。 – clockworkgeek 2016-04-15 10:30:39