簡體   English   中英

具有復合主鍵的表的Magento資源模型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM