Модель ресурса Magento для таблицы с составным первичным ключом
Я создаю настраиваемый модуль для сайта электронной коммерции Magento, и модуль будет сосредоточен вокруг новой (т.е. настраиваемой) таблицы, которая имеет составной/составной первичный ключ, или, скорее, таблица имеет два столбца, которые составляют первичный ключ. Кто-нибудь знает, как создавать модели/модели ресурсов на основе таблицы с составным ключом?
Чтобы дать несколько подробностей, я просмотрел несколько руководств, а также использовал отличный moduleCreator script. Но похоже, что все учебники вращаются вокруг таблицы с ПК с одним столбцом в ней. Что-то вроде этого:
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>');
}
}
Кроме того, я просто заметил, что, глядя на модель базы данных, почти все таблицы имеют один первичный ключ. Я понимаю, что это имеет большое значение для структуры db в стиле EAV, но все же можно использовать таблицу с составной PK? Я хочу придерживаться рамки/соглашения Magento, если это возможно. Это обескураживает? Должен ли я просто изменить структуру моей таблицы, чтобы иметь некоторый столбец id? У меня есть возможность сделать это, но geez!
(Еще одно замечание, которое, как я думал, я бы упомянул, состоит в том, что он выглядит так, как будто Zend Framework обеспечивает способ создания класса в таблице с составным первичным ключом (см. пример № 20 на этой странице - примерно на полпути вниз), поэтому кажется, что инфраструктура Magento должна также обеспечить ее... Я просто не вижу, как.)
Ответы
Ответ 1
Как и большинство моделей, основанных на активной записи, Magento Mage_Core_Model_Abstract
не был создан с поддержкой составных первичных ключей. Любые модели, которые наследуют эту базу (что означает их все), наследуют это предположение. Если вы хотите использовать составные первичные ключи, вы не сможете. Ваш выбор состоит в том, чтобы перейти по маршруту Magento Model и создать единый первичный ключ ( "поддельный", как вы его назвали), а затем применить уникальный индекс к таблице, или реализовать собственный уровень модели, используя базовую таблицу Zend DB, ИЛИ import решение сторонней модели в систему, которая поддерживает функции, которые вы хотите.
Что касается Zend Framework, команда Magento использовала Zend Table Gateway Pattern для реализации слоя модели стиля Active Record для своей структуры. Zend Framework - это не такой стек приложений, как Cake или Rails, это набор библиотек классов, которые можно использовать для создания стеков приложений (или приложений или много чего другого). Просто потому, что что-то поддерживается в классах Zend Framework, это не означает, что системы и приложения, использующие Zend Framework, получают его бесплатно.
Ответ 2
см., что magento Model "Mage_SalesRule_Model_Resource_Coupon_Usage", таблица "salesrule_coupon_usage" имеет составной/составной первичный ключ. Это примерно так:
protected function _construct()
{
$this->_init('salesrule/coupon_usage', '');
}
Ответ 3
Хотя вы не сможете использовать составной первичный ключ в стандартных моделях стиля 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);
Ответ 4
Я знаю, что это старый вопрос, но у меня была такая же проблема, но вот как я его исправил: я добавил все поля, разделенные запятой:
protected function _construct()
{
$this->_init('salesrule/coupon_usage', 'first_field,second_field,...');
}