2013-01-05 42 views
14

Khi sử dụng Sequelize.js, mã sau không thêm bất kỳ khóa ngoại nào trên bảng.Khoá ngoại tiếp của Sequelize.js

var MainDashboard = sequelize.define('main_dashboard', { 
    title: Sequelize.STRING 
}, { 
    freezeTableName: true 
}) 

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' }) 
MainDashboard.hasOne(MainClient, { foreignKey: 'clientId' }) 

sequelize.sync({ force: true }) 

Có cách nào để buộc Sequelize.js thêm những ràng buộc khóa ngoài này không?

Trả lời

3

Tôi chỉ cố gắng để chạy mã của bạn, và các hàng dường như được tạo ra tốt:

CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB; 
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment, `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB; 

clientId được thêm vào main_client, và idClient được thêm vào main_dashboard

Có vẻ như bạn có một chút bối rối phương thức hasOne thực hiện. Mỗi khi bạn gọi hasOne một liên kết được tạo ra, do đó, mã của bạn có hiệu quả kết hợp hai bảng hai lần. Các phương pháp bạn đang tìm kiếm là belongsTo

Nếu bạn muốn mỗi khách hàng để có một bảng điều khiển, mã sẽ được như sau:

MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' }) 
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' }) 

Điều này tạo ra một lĩnh vực ClientId trên bàn main_dashboard, mà liên quan đến trường id của bảng main_client

Trong ngắn hạn belongsTo thêm mối quan hệ vào bảng mà bạn đang gọi phương thức, hasOne thêm nó vào bảng được đưa ra làm đối số.

+0

OK, tải xuống. Trên thực tế, đây chỉ là một ví dụ ngu ngốc. Những gì chúng ta muốn là các ràng buộc khóa cấp cơ sở dữ liệu, giống như @dankohn nói. – swampcypress

4

Bạn cần phải thêm ForeignKeyConstraint: true
Hãy thử

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true }) 
19

Trước khi tôi có cùng một vấn đề, và giải quyết khi tôi hiểu sự hoạt động của các thiết lập Sequelize.

Thẳng đến điểm!

Giả sử chúng ta có hai đối tượng: PersonCha

var Person = sequelize.define('Person', { 

     name: Sequelize.STRING 
}); 

var Father = sequelize.define('Father', { 

     age: Sequelize.STRING, 
     //The magic start here 
     personId: { 
       type: Sequelize.INTEGER, 
       references: 'persons', // <<< Note, its table's name, not object name 
       referencesKey: 'id' // <<< Note, its a column name 
     } 
}); 

Person.hasMany(Father); // Set one to many relationship 

Có lẽ nó giúp bạn

Edit:

Bạn có thể đọc để hiểu rõ hơn:

http://docs.sequelizejs.com/en/1.7.0/docs/associations/#foreign-keys

+2

Việc sử dụng 'references' và' referencesKey' hiện không được chấp nhận => 'Utils deprecated Tài sản tham chiếu không đối tượng được tìm thấy. Hỗ trợ cho điều đó sẽ bị xóa trong phiên bản 4. Dự kiến ​​{reference: {model: "value", key: "key"}} thay vì {references: "value", referencesKey: "key"} .' –

+7

đây không phải là tốt ví dụ, lệnh cuối cùng nói rằng 'một người có nhiều cha 'mà không âm thanh tự nhiên – Buksy

Các vấn đề liên quan