Comment ajouter une clé étrangère à une table par programme?

22

J'essaie d'ajouter un ensemble de nouvelles tables et j'essaie d'ajouter une clé étrangère pour lier ces tables. J'ai cherché en ligne pour essayer de trouver des informations addForeignKey()mais je ne trouve rien.

En regardant Varien_Db_Adapter_Interface::addForeignKey()et Mage_Core_Model_Resource_Setup::getFkName()je pensais avoir correctement installé ci-dessous

->addForeignKey(
     $installer->getFkName('namespace_module/shop', 'area_id', 'namespace_module/area','area_id'),
     $installer->getTable('namespace_module/shop'), 
     'area_id',
     $installer->getTable('namespace_module/area'), 
     'area_id',
     Varien_Db_Ddl_Table::ACTION_CASCADE, 
     Varien_Db_Ddl_Table::ACTION_CASCADE
)  

Mais l'exception dit différent

Zend_Db_Exception Object
(
[_previous:Zend_Exception:private] => 
[message:protected] => Undefined column "shop_locator_shop"
[string:Exception:private] => 
[code:protected] => 0
[file:protected] => /Users/myname/Sites/site/www/lib/Varien/Db/Ddl/Table.php
[line:protected] => 450
[trace:Exception:private] => Array
    (
        [0] => Array
            (
                [file] => /Users/myname/Sites/site/www/app/code/local/Namespace/Module/sql/namespace_module_setup/install-0.1.0.php
                [line] => 110
                [function] => addForeignKey
                [class] => Varien_Db_Ddl_Table
                [type] => ->
                [args] => Array
                    (
                        [0] => FK_SHOP_LOCATOR_SHOP_AREA_ID_SHOP_LOCATOR_AREA_AREA_ID
                        [1] => shop_locator_shop
                        [2] => area_id
                        [3] => shop_locator_area
                        [4] => area_id
                        [5] => CASCADE
                        [6] => CASCADE
                    )

            )

Fondamentalement, comment puis-je ajouter une clé étrangère à ma table (j'ai ajouté une capture d'écran de ce que j'essaie de réaliser)

base de données

tony09uk
la source

Réponses:

29

Essayez-le comme ceci:

->addForeignKey(
     $installer->getFkName('namespace_module/shop', 'area_id', 'namespace_module/area','area_id'),
     'area_id',
     $installer->getTable('namespace_module/area'), 
     'area_id',
     Varien_Db_Ddl_Table::ACTION_CASCADE, 
     Varien_Db_Ddl_Table::ACTION_CASCADE
)  

La différence dans mon code est que j'ai supprimé la première ligne ci-dessous getFkName.
puisque vous appelez addForeignKeyune table lors de sa création, vous n'avez pas besoin de spécifier à nouveau son nom.

en règle générale, utiliser:

->addForeignKey(
     $installer->getFkName('TABLE ALIAS', 'FK_FIELD', 'REF_TABLE_ALIAS','REF_TABLE_FIELD'),
     'CURRENT_TABLE_FIELD_NAME',
     $installer->getTable('REF_TABLE_ALIAS'), 
     'REF_TABLE_FIELD',
     Varien_Db_Ddl_Table::ACTION_CASCADE, 
     Varien_Db_Ddl_Table::ACTION_CASCADE
)  

[Modifier]
Vous devriez regarder Varien_Db_Ddl_Table::addForeignKeyparce que vous l'utilisez sur une instance de Varien_Db_Ddl_Table.

Marius
la source