Bir tabloya yabancı anahtar nasıl programlı olarak eklenir?


22

Bir dizi yeni tablo eklemeye çalışıyorum ve bu tabloları bağlamak için bir yabancı anahtar eklemeye çalışıyorum. Hakkında bazı bilgiler bulmaya çalışmak için çevrimiçi olarak baktım addForeignKey()ancak hiçbir şey bulamadım.

Baktığımda Varien_Db_Adapter_Interface::addForeignKey()ve Mage_Core_Model_Resource_Setup::getFkName()kurulumun doğru yapıldığını sanıyordum

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

Ancak istisna farklı diyor

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
                    )

            )

Temel olarak masama yabancı bir anahtar ekleme konusunda nasıl giderim (elde etmeye çalıştığımın ekran görüntüsünü ekledim)

veritabanı

Yanıtlar:


29

Bu şekilde dene:

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

Kodumdaki fark, aşağıdaki ilk satırı kaldırmam getFkName. bir tabloyu oluştururken
çağırdığınız addForeignKeyiçin adını tekrar belirtmeniz gerekmez.

Genel bir kural olarak kullanmak:

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

[Edit] Bir örneğinde kullandığınız
için bakıyor olmalısınız .Varien_Db_Ddl_Table::addForeignKeyVarien_Db_Ddl_Table

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.