业务需求中,父级表把通过 hasone 把自身的 id 插入到了很多子级表中,例:
father_id 插入到 child1 表中father_id 插入到 child2 表中官方文档说,只要有 hasOne 的关联就能有 get+表名 和 set+ 表名等方法,参考:associations。
但是我一直实现不了,看了好多文档和问答了。
能通过 egg-sequelize 的 examples/sequelize-example at master · eggjs/examples 说明一下怎么通过最后添加的用户找到他最后添加的 post 么?
我试过这样:
const user = await this.ctx.model.User.findOne({
order: [['created_at', 'desc']]
})
// const post = await user.getpost() // 方式1
// const post = await this.ctx.model.User.getpost() // 方式2
都说 getpost 不是函数。
注意大小写,以及单复数形式
user.getPosts();
xports.sequelize = {
db1: {
dialect: 'mysql',
// host
host: 'mysql.com',
// 端口号
port: '3306',
// 用户名
user: 'test_user',
// 密码
password: 'test_password',
// 数据库名
database: 'test',
},
db2: {
dialect: 'postgresql',
// host
host: 'postgresql.com',
// 端口号
port: '5432',
// 用户名
user: 'test_user',
// 密码
password: 'test_password',
// 数据库名
database: 'test',
},
};
这样同时同时使用多数据源,如:MariaDB+PostgreSQL?
@Maroon1 还是有问题,这种方法我也试过了,我创建了一个最小复现仓库,在 scottming/eggjs-test at getset 分支
修改 eggjs-test/config.default.js at getset · scottming/eggjs-test 之后,运行 npm run dev,然后添加以下数据:
Post http://127.0.0.1:7001/users
{
"name": "scott1",
"age": 26
}
Post http://127.0.0.1:7001/users/1/posts
// post1
{
"title": "test title1",
"content": "test content"
}
// post2
{
"title": "test title2",
"content": "test content"
}
然后便可复现我的问题
Post http://127.0.0.1:7001/post
{
"name": "scott"
}
nodejs.TypeError: user.getPosts is not a function
@scottming 那个官方模板代码写错了
associate 方法定义那一行应该要定义成静态方法,模板中定义成了实例方法,所以其实那一行的代码并没有被调用,所以 user 和 post 并没有关联起来
正确写法
// User.prototype.associate = function () {
User.associate = function () {
app.model.User.hasMany(app.model.Post, { as: 'posts', foreignKey: 'user_id' })
}
@Maroon1 太感谢了,被这个点折腾了好久。
Most helpful comment
@scottming 那个官方模板代码写错了
associate 方法定义那一行应该要定义成静态方法,模板中定义成了实例方法,所以其实那一行的代码并没有被调用,所以 user 和 post 并没有关联起来
正确写法