当前位置: 首页 > 面试题库 >

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

阎经武
2023-03-14
问题内容

我想通过sequelize正确设置一对一或一对多关系,事实上,如果我在模型定义中使用hasOne/hasMany或之一,那么一切似乎都很好belongsTo。例如,以下关联确实userId在其目标上创建了字段:

    User.hasMany(Email, {
        as: 'emails',
        foreignKey: 'userId',
    })

    User.hasOne(Profile, {
        as: 'profile',
        foreignKey: 'userId',
    })

但是在官方文档中几乎到处我都看到类似的东西:

   Projects.hasMany(Tasks);
   Tasks.belongsTo(Projects);

hasManyANDbelongsTo一起使用。

这真的是必需的,还是仅使用其中之一就足够了?任何进一步的解释都是非常有价值的。谢谢!


问题答案:

使用belongsTo定义关联模型的所有权。为了更详细地说明这一点,我将参考教程中引用的示例

Project.hasMany(Task);
Task.belongsTo(Project);

假设您不再对已删除项目的任务感兴趣。在这种情况下,如果未定义belongsTo关联,则必须手动删除任务。belongsTo建立对其任务的项目所有权,数据库也会自动删除属于已删除项目的任务。这被称为cascading delete并可链接多个表。

如果运行以下代码段

const Project = sequelize.define('project', {
    name: Sequelize.STRING
});
const Task =  sequelize.define('task', {
    name: Sequelize.STRING
});
Project.hasMany(Task);
Task.belongsTo(Project);

在续集脚本中并观看输出

Executing (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);

您会注意到在创建任务表时设置了级联行为。

说了这么多,最后的答案是:取决于情况。belongsTo如果您想保留已删除项目的任务,使用可能会非常方便或致命。仅belongsTo在您的应用程序上下文中有意义时才使用。



 类似资料:
  • 那么,我应该只使用Antisamy或CSP,还是两者都使用都是有益的? 提前谢谢你。

  • 我想知道存储一些全局变量是否是一个好的做法,例如:THREAD_PER_CORE(确定我的线程池中应该有多少个线程)WAIT_DELETE_MESSAGE(确定消息应该持续多长时间) 在.properties文件中。 或者我应该使用一个将这些定义为全局公共静态变量的类 或者我应该同时执行这两个操作,然后读取这些属性文件,将它们作为公共静态变量存储在该类中 或者我应该把所有的东西都设置为环境变量..

  • 我在想像这样的东西: 内容类型:text/html;Charset=<某些编码>

  • 这是我第一次使用IdentityServer4和AspNetIdentity设置OpenID Connect,我希望有人能揭开关于存储用户数据的神秘面纱。 到目前为止,我读到的是,用户数据应该存储在连接到Auth服务器的Auth db中,但我真的希望将用户数据存储在连接到资源服务器的资源db中。 我目前有一个如下所示的数据模型: 还有人说,与Auth无关的数据,如用户的城市或国家,不应该存储在Au

  • BelongsTo relations 隶属关系 简介 定义 belongsTo 关系 方法加入到模型 简介 一个 Model 设置 belongsTo relation(隶属关系) 时同时,另一个 model 相应的设置了 一对一 或者 一对多的关系 在一个多到一的关系每个声明 "belongs to"的实例,都必定有它隶属的 其他 Model 实例对象(目标对象). 而对象目标可以有多种关系模

  • HasMany relations (一对多的关系) 简介 定义 HasMany 关系 添加方法到 HasMany 的模型 定义 hasMany 关系建立一个一对多的连接到其他 Model, 经常 其他模型还会设置 belongsto 关联到 这个模型。 这个关系(hasMany) 表示每个实例,都关联着 0 个或者多个其他 model 例如,在与客户定单的应用程序,客户可以有许多订单,如下图所示