egg-sequelize 如何使用 sequelize 的 set、get 开头的方法

Created on 10 Apr 2018  ·  5Comments  ·  Source: eggjs/egg

业务需求中,父级表把通过 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 不是函数。

Most helpful comment

@scottming 那个官方模板代码写错了
associate 方法定义那一行应该要定义成静态方法,模板中定义成了实例方法,所以其实那一行的代码并没有被调用,所以 user 和 post 并没有关联起来

正确写法

// User.prototype.associate = function () {
User.associate = function () {
  app.model.User.hasMany(app.model.Post, { as: 'posts', foreignKey: 'user_id' })
}

All 5 comments

注意大小写,以及单复数形式

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 太感谢了,被这个点折腾了好久。

Was this page helpful?
0 / 5 - 0 ratings

Related issues

jtyjty99999 picture jtyjty99999  ·  52Comments

shaoshuai0102 picture shaoshuai0102  ·  52Comments

itsky365 picture itsky365  ·  62Comments

atian25 picture atian25  ·  68Comments

zrxisme picture zrxisme  ·  44Comments