Bagaimana cara menambahkan kunci asing ke tabel secara terprogram?

22

Saya mencoba menambahkan seperangkat tabel baru dan saya mencoba menambahkan kunci asing untuk menautkan tabel ini. Saya telah mencari online untuk mencoba dan menemukan beberapa informasi tentang addForeignKey()tetapi tidak dapat menemukan apa pun.

Melihat Varien_Db_Adapter_Interface::addForeignKey()dan Mage_Core_Model_Resource_Setup::getFkName()saya pikir saya sudah menyiapkan di bawah dengan benar

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

Tetapi pengecualiannya berbeda

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
                    )

            )

Pada dasarnya bagaimana cara menambahkan kunci asing ke meja saya (saya telah menambahkan tangkapan layar dari apa yang saya coba capai)

basis data

tony09uk
sumber

Jawaban:

29

Coba seperti ini:

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

Perbedaan dalam kode saya adalah bahwa saya menghapus baris pertama di bawah ini getFkName.
karena Anda memanggil addForeignKeytabel saat membuatnya, Anda tidak perlu menentukan nama itu lagi.

sebagai penggunaan aturan umum:

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

[Sunting]
Anda harus melihatnya Varien_Db_Ddl_Table::addForeignKeykarena Anda menggunakannya pada instance dari Varien_Db_Ddl_Table.

Marius
sumber