Wie füge ich programmgesteuert einen Fremdschlüssel zu einer Tabelle hinzu?

22

Ich versuche, einen Satz neuer Tabellen hinzuzufügen, und ich versuche, einen Fremdschlüssel hinzuzufügen, um diese Tabellen zu verknüpfen. Ich habe online nach Informationen gesucht addForeignKey(), kann aber nichts finden.

Ich schaute zu Varien_Db_Adapter_Interface::addForeignKey()und Mage_Core_Model_Resource_Setup::getFkName()dachte, ich hätte das Setup unten richtig verstanden

->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
)  

Aber die Ausnahme besagt etwas anderes

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
                    )

            )

Wie füge ich einen Fremdschlüssel zu meinem Tisch hinzu? (Ich habe einen Screenshot von dem hinzugefügt, was ich erreichen möchte.)

Datenbank

tony09uk
quelle

Antworten:

29

Versuchen Sie es wie folgt:

->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
)  

Der Unterschied in meinem Code ist, dass ich die erste Zeile darunter entfernt habe getFkName.
Da Sie addForeignKeyeine Tabelle beim Erstellen aufrufen , müssen Sie ihren Namen nicht erneut angeben.

In der Regel verwenden Sie:

->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
)  

[Bearbeiten]
Sie sollten suchen, Varien_Db_Ddl_Table::addForeignKeyweil Sie es auf einer Instanz von verwenden Varien_Db_Ddl_Table.

Marius
quelle