使用UpdatePivot附加“Not Null”列

时间:2014-03-03 06:02:50

标签: bookshelf.js knex.js

使用bookshelfjs,我想将记录添加到包含附加列,而不是可空列的连接表中。

例如,用户表和帐户表将具有accounts_users的连接表。

var Account = Bookshelf.Model.extend({
  tableName: 'accounts'
});

var User = Bookshelf.Model.extend({

  tableName: 'users',

  accounts: function () {
    return this.belongsToMany(Account);
  }
});

连接表还有一个“order”列NOT NULL。

CREATE TABLE accounts_users
(
  account_id integer NOT NULL,
  user_id integer NOT NULL,
  "order" integer NOT NULL,
  CONSTRAINT accounts_users_account_id_foreign FOREIGN KEY (account_id)
      REFERENCES accounts (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT accounts_users_user_id_foreign FOREIGN KEY (user_id)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

是否可以将用户中的记录附加到帐户中的记录,并同时设置订单值?

每个人都可以使用以下方式单独完成:

user.related("accounts").attach(<USER_ID>);

user.related("accounts").updatePivot({order: 1}); // with WHERE clause.

单独运行每个命令将失败,因为第一个命令不会满足NOT NULL限制。有没有办法使用书架一起执行这两个命令?可以使用Knex.Raw轻松完成,但我想尽可能使用书架。

1 个答案:

答案 0 :(得分:7)

您可以将名称/值对传递到.attach,以便在连接表记录中设置这些值。请参阅此GitHub问题第一部分中的示例:

https://github.com/tgriesser/bookshelf/issues/134

user.related('accounts').attach({ account_id: 42, user_id: 84, order: 1})