Модель ресурсов Magento для таблицы с составным первичным ключом - PullRequest
17 голосов
/ 09 июня 2010

Я создаю пользовательский модуль для сайта электронной коммерции Magento, и модуль будет сосредоточен вокруг новой (т. Е. Пользовательской) таблицы, которая имеет составной / составной первичный ключ, или, скорее, таблица имеет два столбца, которые составляют первичный ключ. Кто-нибудь знает, как создавать ваши модели / модели ресурсов на основе таблицы с составным ключом?

Чтобы дать больше подробностей, я просмотрел несколько учебных пособий, а также использовал отличный скрипт moduleCreator . Но кажется, что все учебные пособия вращаются вокруг стола, в котором есть ПК с одним столбцом. Как то так:

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, если это возможно. Это не рекомендуется? Должен ли я просто изменить структуру моей пользовательской таблицы, чтобы иметь некоторый столбец фиктивного идентификатора? У меня есть возможность сделать это, но, черт возьми!

(Еще одно замечание, которое я хотел бы упомянуть, заключается в том, что, похоже, Zend Framework предоставляет способ создания класса на основе таблицы с составным первичным ключом ( см. Пример # 20 на этой странице - примерно на полпути вниз), поэтому кажется, что инфраструктура Magento также должна обеспечивать это ... Я просто не понимаю, как.)

Ответы [ 4 ]

29 голосов
/ 10 июня 2010

Как и большинство моделей, основанных на Active Record, Magento Mage_Core_Model_Abstract не был создан с учетом поддержки составных первичных ключей. Любые модели, которые наследуют от этой базы (имеется в виду все они), наследуют это предположение. Если вы хотите использовать составные первичные ключи, вы не сможете. Вы можете выбрать маршрут модели Magento и создать один первичный ключ («фальшивый», как вы его назвали), а затем применить уникальный индекс к таблице, ИЛИ внедрить свой собственный уровень модели, используя базовую таблицу Zend DB, ИЛИ импортировать решение сторонней модели в систему, которая поддерживает функции, которые вы хотите.

Что касается Zend Framework, команда Magento использовала шаблон Zend Table Gateway Pattern для реализации слоя модели Active Record в стиле для своей платформы. Zend Framework не является стеком приложений, таким как Cake или Rails, это набор библиотек классов, которые можно использовать для создания стеков приложений (или приложений, или множества других вещей). То, что что-то поддерживается в классах Zend Framework, не означает, что системы и приложения, использующие Zend Framework, получают это бесплатно.

6 голосов
/ 29 июля 2015

обратите внимание, что в magento Model «Mage_SalesRule_Model_Resource_Coupon_Usage» таблица «salesrule_coupon_usage» имеет составной / составной первичный ключ. Это так:

protected function _construct()
{
    $this->_init('salesrule/coupon_usage', '');
}
5 голосов
/ 23 января 2014

Хотя вы не сможете использовать составной первичный ключ в стандартных моделях стиля Active Record, можно легко создать составной первичный ключ в поддерживаемой миграции базы данных, установив для каждого поля первичное значение;

/**
 * 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);
1 голос
/ 09 апреля 2016

Я знаю, что это старый вопрос, но у меня была та же проблема, но вот как я ее исправил: я добавил все поля, разделенные запятой:

protected function _construct()
{
    $this->_init('salesrule/coupon_usage', 'first_field,second_field,...');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...