回答

收藏

续集hasMany,belongsTo还是两者兼而有之?

技术问答 技术问答 194 人阅读 | 0 人回复 | 2023-09-14

我想通过sequelize事实上,如果我在模型定义中正确地设置一对一或一对多的关系,hasOne/hasMany或者,那么一切似乎都很好belongsTo。例如,以下关联是真的userId在其目标上创建字段:
0 z4 O. Z2 t' z( A/ Y0 d                User.hasMany(Email,{          as: 'emails         foreignKey: 'userId User.hasOne(Profile,{          as: 'profile         foreignKey: 'userId 但我在官方文件中几乎看到了类似的东西:
  C$ |* P: M4 Q% W" j# k; J0 f            Projects.hasMany(Tasks);   Tasks.belongsTo(Projects);即hasManyANDbelongsTo一起使用。) k" q! I' ]( M) F/ n; L
这真的是必要的,还是只用其中一个就够了?任何进一步的解释都是非常有价值的。!
# O) ?' h( z2 x2 x                                                                $ |. ^: R5 e8 ^! D1 }4 \4 \& U, ^
    解决方案:                                                                & |. H7 B& ^  t& \2 _' Y
                                                                使用belongsTo定义相关模型的所有权。为了更详细地解释这一点,我将参考教程中引用的示例
, h- K' M8 o: r5 k( r/ Q0 R# [Project.hasMany(Task);Task.belongsTo(Project);假设您不再对删除项目的任务感兴趣。在这种情况下,如果没有定义belongsTo任务必须手动删除。belongsTo为其任务建立项目所有权,数据库将自动删除已删除项目的任务。这被称为cascadingdelete并且可以链接多个表。% G  G+ _6 ~6 {
若操作以下代码段
1 z% s# i2 }% c* I) u0 jconst Project = sequelize.define('project{     name: Sequelize.STRING});const Task =  sequelize.define('task{     name: Sequelize.STRING})roject.hasMany(Task);Task.belongsTo(Project);在续集脚本中观看输出
% L5 `( F; I0 I1 e8 TExecuting (default): DROP TABLE IF EXISTS `projects`;Executing (default): CREATE TABLE IF NOT EXISTS `projects` (`id` INTEGER PRIMARY KEY AUTOINCREMENT,`name` VARCHAR(255),`createdAt` DATETIME NOT NULL,`updatedAt` DATETIME NOT NULL);Executing (default): PRAGMA INDEX_LIST(`projects`)Executing (default): DROP TABLE IF EXISTS `tasks`;Executing (default): CREATE TABLE IF NOT EXISTS `tasks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT,`name` VARCHAR(255),`createdAt` DATETIME NOT NULL,`updatedAt` DATETIME NOT NULL,`projectId` INTEGER REFERENCES `projects` (`id`) ON DELETE SET NULL ON UPDATE CASCADE);在创建任务表时,您会注意到设置级联行为。
* h2 {! Y1 B* \说了这么多,最后的答案是:这取决于情况。belongsTo如果您想保留删除项目的任务,使用可能非常方便或致命。belongsTo在您的应用程序上下文中有意义时使用。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则