2010-06-09 4 views
16

Tworzę niestandardowy moduł dla witryny e-commerce Magento, a moduł będzie koncentrował się wokół nowej (tj. Niestandardowej) tabeli, która ma złożony klucz główny złożony lub raczej tabela ma dwie kolumny, które składają się na klucz podstawowy. Czy ktoś wie, jak tworzyć modele/modele zasobów w oparciu o tabelę z kluczem złożonym?Model zasobów Magento dla tabeli ze złożonym kluczem podstawowym

Aby podać więcej szczegółów, zapoznałem się z kilkoma samouczkami, a także skorzystałem ze znakomitego skryptu moduleCreator. Wygląda jednak na to, że wszystkie tutoriale krążą wokół stołu z PK z jedną kolumną. Coś takiego:

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>'); 
    } 
} 

Ponadto zauważyłem, że patrząc na model bazy danych prawie wszystkie tabele mają jeden klucz podstawowy. Rozumiem, że ma to wiele wspólnego ze strukturą db w stylu EAV, ale czy jest możliwe użycie tabeli ze złożonym PK? Chcę, jeśli to możliwe, trzymać się frameworku/konwencji Magento. Czy to zniechęca? Czy powinienem po prostu zmienić strukturę mojej niestandardowej tabeli, aby mieć kolumnę idiotyczną? Mogę to zrobić, ale geez!

(Inną notatką, o której myślałem, że chciałbym wspomnieć, jest to, że wygląda na to, że Zend Framework zapewnia sposób na oparcie klasy na stole złożonym kluczem podstawowym (see Example #20 on this page - około połowy drogi), więc wydaje się, że struktura Magento powinna również zapewniać to ... Po prostu nie rozumiem.)

Odpowiedz

27

Podobnie jak większość modeli inspirowanych Active Record, Magento's Mage_Core_Model_Abstract nie został zbudowany z myślą o obsłudze złożonych kluczy podstawowych. Wszystkie modele dziedziczące z tej bazy (czyli wszystkie z nich) dziedziczą to założenie. Jeśli chcesz używać złożonych kluczy podstawowych, nie będziesz w stanie. Możesz wybrać trasę modelu Magento i utworzyć pojedynczy klucz podstawowy ("fałszywy", jak go nazwałeś), a następnie zastosować unikalny indeks do tabeli, LUB zaimplementować własną warstwę modelu za pomocą podstawowej tabeli Zend DB, LUB zaimportować rozwiązanie modelu strony trzeciej w systemie, które obsługuje wybrane funkcje.

Jeśli chodzi o Zend Framework, zespół Magento użył Zend's Table Gateway Pattern to implement an Active Record style Model layer dla swojej architektury. Zend Framework nie jest stosem aplikacji, takim jak Cake czy Rails, jest zbiorem bibliotek klas, które mogą być używane do tworzenia stosów aplikacji (lub aplikacji lub wielu innych rzeczy). To, że coś jest obsługiwane w klasach Zend Framework, nie oznacza, że ​​systemy i aplikacje korzystające z Zend Framework otrzymują je za darmo.

+5

Alan, twoja odpowiedzi są zawsze wyjątkowe. – shaune

4

Chociaż nie można użyć złożonego klucza podstawowego w standardowych modelach stylu rekordu aktywnego, można łatwo utworzyć złożony klucz podstawowy w migracji bazy danych, ustawiając każde pole na podstawowe;

/** 
* 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

zobaczyć, że Magento model „Mage_SalesRule_Model_Resource_Coupon_Usage” tabela 'salesrule_coupon_usage' ma związek/kompozytowy klucz podstawowy. To jest tak:

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

wiem, że to jest stare pytanie, ale miałem ten sam problem, ale tutaj jak naprawiłem go: I dodaje wszystkie pola oddzielone przecinkami:

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

Działa to tylko w przypadku zapisywania obiektu z podstawowymi wartościami w miejscu. To najwyraźniej nie pomaga w ładowaniu lub usuwaniu. Standardowe modele zasobów nie są zaprojektowane w ten sposób i działają tylko przez szczęście. – clockworkgeek