node.js – 我对Sails.js水线一对一关联逻辑感到困惑

所以我之所以感到困惑,是因为我是一名 PHP开发人员并且使用过很多Laravel和FuelPHP

我真正理解的是它自己的关联.

我的意思是,我想创建一个基本的hasOne / BelongsTo逻辑,具体如下

用户有一个个人资料

个人资料属于用户

我习惯了下面的建立(Laravel风格)

用户表

id | username    | email     | password 
---------------------------------------
1  | My Username | My email  | 1234568

Users_profile表

user_id | first_name    | last_name      
----------------------------------------
1       | My First name | My Last name

然后我就这样定义了模型

用户模型

class Users extends Eloquent 
{
    public function profile() 
    {
        return $this->hasOne('profile');
    }
}

档案模型

class Profile extends Eloquent 
{
    protected $tableName = 'users_profile';

    protected $primaryKey = 'user_id';

    public function user() 
    {
        return $this->belongsTo('User');
    }
}

它只是起作用,因为返回$this-> hasOne(‘profile’);将自动检查user_id

在Sails.js中尝试过相同的方法(以帆的方式)

用户模型

module.exports = {

  attributes: {

    username: {
        type: 'string',
        unique: true,
        required: true
    },

    email: {
        type: 'string',
        unique: true,
        email: true,
        required: true
    },

    password: {
        type: 'string',
        required: true
    },

    profile: {
      model: "profile",
    }

  },
};

档案模型

module.exports = {

    tableName: 'user_profile',

    autoPK: false,

    autoCreatedAt: false,

    autoUpdateddAt: false,

  attributes: {

    user_id: {
        type: 'integer',
        primaryKey: true
    },

    first_name: {
        type: 'string',

    },

    last_name: {
        type: 'string',

    },

    user: {
      model: "user"
    }

  }
};

现在阅读文档,我必须以这种方式更新我的表

id | username    | email     | password | profile
-------------------------------------------------
1  | My Username | My email  | 1234568  | 1



user_id | first_name    | last_name    | user |
-----------------------------------------------
1       | My First name | My Last name |  1

所以我需要再次存储2个id,我真的不明白为什么.

比我读更进一步试图使用通过没有工作(注意到的是收藏)

那么,任何人都可以给我一个Laravelis风格的逻辑例子吗?

在文档中没有任何关于这个(更简单的方式),因为在我看来,如果用户将有更多的关系,这将导致和ID地狱(只是我的aopinion)

Sails并不完全支持一对一关联,这是 known issue;您必须在您希望能够填充的任何一侧设置外键.也就是说,如果您希望将User#1链接到Profile#1并且能够执行User.find(1).populate(‘profile’),您可以设置User#1的profile属性,但这并不是’ t自动表示执行Profile.find(1).populate(‘user’)将起作用.这与Sails中的多对多关系相反,在一侧添加链接就足够了.这是因为to-many关系使用连接表,而to-one关系则不然.

这在Sails中不是优先考虑的原因是一对一关系通常不是很有用.除非你有really compelling reason不这样做,否则你最好将两个模型合并为一个.

在任何情况下,如果它是您真正需要的东西,您可以使用.afterCreate lifecycle callback来确保双向链接,例如在User.js中:

module.exports = {

  attributes: {...},

  afterCreate: function(values, cb) {

    // If a profile ID was specified, or a profile was created 
    // along with the user...
    if (values.profile) {
      // Update the profile in question with the user's ID
      return Profile.update({id: values.profile}, {user: values.id}).exec(cb);
    }

    // Otherwise just return
    return cb();
  }
};

您可以向Profile.js添加类似的.afterCreate(),以便在创建配置文件时更新受影响的用户.

相关文章
相关标签/搜索