2010-06-09 11 views
16

Estoy creando un módulo personalizado para un sitio de comercio electrónico de Magento, y el módulo se centrará en una nueva tabla (compuesta, personalizada) que tenga una clave primaria compuesta/compuesta, o la tabla tiene dos columnas que constituyen la clave principal. ¿Alguien sabe cómo crear sus modelos/modelos de recursos basados ​​en una tabla con una clave compuesta?Modelo de recurso de Magento para la tabla con clave primaria compuesta

Para dar algunos detalles más, he buscado varios tutoriales y también he usado el excelente script moduleCreator. Pero parece que todos los tutoriales giran alrededor de la tabla con un PK con solo una columna. Algo como esto:

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

Además, acabo de notar que al mirar el modelo de la base de datos, casi todas las tablas tienen una sola clave principal. Entiendo que esto tiene mucho que ver con la estructura db estilo EAV, pero ¿aún es posible usar una tabla con un PK compuesto? Quiero seguir con el marco/convenciones de Magento si es posible. ¿Está desalentado? ¿Debo simplemente cambiar la estructura de mi tabla personalizada para tener alguna columna de identificación ficticia? Tengo la capacidad de hacer eso, pero ¡Dios!

(Otra nota al margen que pensé que mencionaría es que parece que el Zend Framework proporciona una forma de basar una clase en una tabla con la clave primaria compuesta (see Example #20 on this page - aproximadamente a la mitad), por lo que parece que el marco de Magento también debería preverlo ... Simplemente no veo cómo).

Respuesta

27

Como la mayoría de los modelos inspirados en Active Record, el Mage_Core_Model_Abstract de Magento no se creó teniendo en cuenta las claves primarias compuestas. Todos los modelos que heredan de esta base (es decir, todos ellos) heredan esta suposición. Si desea usar claves primarias compuestas, no podrá hacerlo. Sus opciones son ir a la ruta del modelo de Magento y crear una única clave principal ("falsa", como la llamó) y luego aplicar un índice único a la tabla, O implementar su propia capa de modelo utilizando la base Zend DB Table, O importar una solución de modelo de terceros en el sistema que admita las características que desea.

Por lo que respecta a Zend Framework, el equipo de Magento usó Zend's Table Gateway Pattern to implement an Active Record style Model layer para su framework. Zend Framework no es una pila de aplicaciones como Cake o Rails, es una colección de librerías de clases que se pueden usar para construir pilas de aplicaciones (o aplicaciones, o muchas otras cosas). El hecho de que algo sea compatible con las clases de Zend Framework no significa que los sistemas y aplicaciones que usan Zend Framework lo obtengan de forma gratuita.

+5

Alan, su las respuestas siempre son sobresalientes – shaune

4

Si bien es posible que no pueda utilizar una clave primaria compuesta en los Modelos de estilo Active Record estándar, puede crear fácilmente una clave primaria compuesta en una migración de base de datos de soporte estableciendo cada campo como primario;

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

ver que Magento Modelo “Mage_SalesRule_Model_Resource_Coupon_Usage”, la tabla 'salesrule_coupon_usage' tiene una clave principal compuesto/compuesto. Es así:

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

Sé que esto es una cuestión de edad pero que tenía el mismo problema, pero aquí cómo lo fijé: he añadido todos los campos separados por comas:

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

Esto solo funciona si guarda un objeto con los valores primarios en su lugar. Aparentemente no ayuda con la carga o eliminación. Los modelos de recursos estándar no están diseñados de esta manera y solo funcionan un poco con la suerte. – clockworkgeek

Cuestiones relacionadas