gpt4 book ai didi

node.js - 一对一的关系和建立联系

转载 作者:行者123 更新时间:2023-12-03 22:42:54 26 4
gpt4 key购买 nike

到目前为止,我真的很喜欢 Sequelize,但有些东西我似乎无法理解并正确设置。我了解数据库模式以及如何编写 SQL,但是当涉及到这种类型的关系时,我只是不理解这个 ORM 的某些方面。

我的模型中的两个对象/表需要一对一的关系以及一对多的关系。这就是我将如何描述它...

用户

  • 有很多媒体(应该在媒体表上创建 FK 作为 UserId)
  • 有一个名为 PrimaryMedia 的媒体(应该在 User 表上创建 FK 作为 PrimaryMediaId)

  • 我已经阅读了几次文档并尝试了不同的排列以使表格以正确的方式创建,但随后我不明白在 setter/getter 方面对我的对象有什么期望。即,对于上面的例子,我希望......

    用户
  • 有 addMedia、removeMedia 和 setMedia 方法
  • 有方法 setPrimaryMedia

  • 设置这两个模型对象的正确方法是什么?

    编辑:我已经设法让一对一完全工作,但一对多没有更新外键......

    用户.js
    ...
    User.hasMany(models.Media, {
    as: 'Media',
    foreignKeyConstraint: true
    }),
    User.hasOne(models.Media, {
    as: 'PrimaryMedia'
    }),
    User.belongsTo(models.Media, {
    as: 'PrimaryMedia',
    foreignKey: 'PrimaryMediaId'
    })
    ...

    媒体.js
    ...
    Media.hasOne(models.User, {
    as: 'User',
    foreignKey: 'PrimaryMediaId'
    }),
    ...

    在行动...
    Media.create({
    type: 'image',
    nativeURL: nativeURL,
    mediumURL: mediumURL,
    smallURL: smallURL
    }).success(function(newMedia) {
    _user.addMedium(newMedia).success(function(){ // THIS ISN'T WORKING (Media.UserId column always null)
    console.log('media user set');
    });
    _user.setPrimaryMedia(newMedia).success(function(){ // THIS IS WORKING
    console.log('user primary media set');
    });
    success(newMedia);
    }).error(function(err) {
    error(err);
    });

    最佳答案

    也许将属性 'primary' 添加到 Media,并用作:

    user.addMedium(newMedia, { primary: true });

    我运行你的代码,它的工作:
    var sequelize = new Sequelize('schema', 'user', 'password', {host: 'localhost'});

    User = sequelize.define('User', {name: Sequelize.STRING});

    Media = sequelize.define('Media', {title: Sequelize.STRING});

    User.hasMany(Media, {
    as: 'Media',
    foreignKeyConstraint: true
    }),

    User.hasOne(Media, {
    as: 'PrimaryMedia'
    }),

    User.belongsTo(Media, {
    as: 'PrimaryMedia',
    foreignKey: 'PrimaryMediaId'
    });

    sequelize.sync().success(function(){

    User.create().success(function(_user){

    Media.create({}).success(function(newMedia) {

    _user.addMedium(newMedia).success(function(){ // THIS ISN'T WORKING (Media.UserId column always null)
    console.log('media user set');
    }).error(function(error){
    console.log('cant add media', error);
    });

    _user.setPrimaryMedia(newMedia).success(function(){ // THIS IS WORKING
    console.log('user primary media set');
    }).error(function(error){
    console.log('cant set primaryMedia', error);
    });

    }).error(function(err) {
    error(err);
    });

    }).error(function(error){
    console.log('user create', error)
    })

    }).error(function(error){
    console.log('sync error', error);
    });

    日志:
    INSERT INTO `Users` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2014-02-24 13:01:57','2014-02-24 13:01:57');
    INSERT INTO `Media` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2014-02-24 13:01:57','2014-02-24 13:01:57');
    SELECT * FROM `Media` WHERE `UserId` = 1 AND `Media`.`id` = 1;
    UPDATE `Users` SET `PrimaryMediaId`=1,`updatedAt`='2014-02-24 13:01:57' WHERE `id`=1
    user primary media set
    UPDATE `Media` SET `id`=1,`createdAt`='2014-02-24 13:01:57',`updatedAt`='2014-02-24 13:01:57',`UserId`=1 WHERE `id`=1
    media user set

    关于node.js - 一对一的关系和建立联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947676/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com