Làm thế nào để thêm khóa ngoại vào bảng theo chương trình?


22

Tôi đang cố gắng thêm một tập hợp các bảng mới và tôi đang cố gắng thêm một khóa ngoại để liên kết các bảng này. Tôi đã xem trực tuyến để thử và tìm một số thông tin về addForeignKey()nhưng không thể tìm thấy bất cứ điều gì.

Nhìn vào Varien_Db_Adapter_Interface::addForeignKey()Mage_Core_Model_Resource_Setup::getFkName()tôi nghĩ rằng tôi đã thiết lập chính xác dưới đây

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

Nhưng ngoại lệ nói khác

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
                    )

            )

Về cơ bản làm thế nào để tôi thêm về một khóa ngoại vào bảng của mình (Tôi đã thêm một ảnh chụp màn hình về những gì tôi đang cố gắng đạt được)

cơ sở dữ liệu

Câu trả lời:


29

Hãy thử nó như thế này:

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

Sự khác biệt trong mã của tôi là tôi đã xóa dòng đầu tiên bên dưới getFkName.
vì bạn đang gọi addForeignKeytrên bàn trong khi tạo bảng, bạn không cần chỉ định lại tên của nó.

như một quy tắc chung sử dụng:

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

[Chỉnh sửa]
Bạn nên xem xét Varien_Db_Ddl_Table::addForeignKeyvì bạn đang sử dụng nó trên một ví dụ Varien_Db_Ddl_Table.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.