Подтвердить что ты не робот

Модель ресурса 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 должна также обеспечить ее... Я просто не вижу, как.)

4b9b3361

Ответ 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,...');
}