gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:44 25 4
gpt4 key购买 nike

所以我之所以感到困惑,是因为我是一名 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');
}
}

它确实有效,因为 return $this->hasOne('profile'); 会自动检查 user_id

在 Sails.js 中尝试了同样的方法(以 sails 的方式)

用户模型

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,但我真的不明白为什么。

比我进一步阅读尝试使用 via 没有用(注意这是为了收藏)

那么,有人可以给我一个 Laravelis 风格的逻辑示例吗?

在文档中对此一无所知(一种更简单的方法),因为在我看来,如果用户有更多的关系,这将导致 ID hell (只是我的意见)

最佳答案

这是一个known issue Sails 不完全支持一对一关联;您必须在您希望能够从中填充的任何一侧设置外键。也就是说,如果您想将 User #1 链接到 Profile #1 并且能够执行 User.find(1).populate('profile' ),您将设置 User #1 的 profile 属性,但这并不自动意味着执行 Profile.find(1)。 populate('user') 将起作用。这与 Sails 中的多对多 关系相反,后者在一侧添加链接就足够了。这是因为对多 关系使用连接表,而对一 关系不使用。

这在 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();
}
};

您可以将类似的 .afterCreate() 添加到 Profile.js 以在创建配置文件时处理更新受影响的用户。

关于node.js - 我对 Sails.js 水线一对一关联逻辑感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744179/

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