Ассоциация BelongsToMany и вставка в БД с использованием NodeJS Sequelize - PullRequest
0 голосов
/ 11 января 2019

У меня 2 класса A и B, 3 таблицы A, B и AB

A.belongsToMany(B,as:'Bs', through: models.AB) 
B.belongsToMany(A,as:'As', through: models.AB)

До сих пор ассоциации работали так, что я могу выбрать A с включенным B и наоборот.

когда я пытаюсь создать A, я отправляю JSON, включая выбранные значения B. Мой JSON:

{
"name" : "A"
"Bs": [
        {"id_B" : 1},
        {"id_B" :2},
        {"id_B" :3}
    ]
}

Мой код для вставки строк:

A= await models.A.build(req.body, 
           {
             transaction:transaction,
             include:[
                { as:'Bs',required:true,model:models.B},
             ]
           }
)

То, что я ожидаю, будет результатом для продолжения создания строк внутри таблицы AB с предоставленным идентификатором и вновь созданным id_A, но вместо этого он пытается создать строку id_B внутри таблицы B и терпит неудачу из-за других атрибутов, которые не могут быть нулевым.

Я долго искал и пробовал несколько решений, я понимаю, что могу сделать это в два этапа:

1) создать A

2) A.addB () * 1 018 *

Вопрос:

1) возможно ли сделать это за один шаг?

2) Я что-то не так делаю с моим JSON или просто невозможно?

1 Ответ

0 голосов
/ 05 февраля 2019

Использование include в create / build означает, что мы хотим вставить записи во включенную таблицу. Поэтому следующее включение означает, что записи должны быть вставлены в таблицу B:

include:[
            { as:'Bs',required:true,model:models.B},
        ]

Так как значения B уже существуют в БД, значения должны быть добавлены только к A и AB, поэтому необходимо:

  1. Добавить связь между A и AB таблицами.
  2. Используйте AB в операторе create / build.

Код должен выглядеть так:

A.belongsToMany(B, { through: AB, as: 'Bs', foreignKey: 'id_A' }); // Not relevant for this use case
B.belongsToMany(A, { through: AB, as: 'As', foreignKey: 'id_B' }); // Not relevant for this use case
A.hasMany(AB, { as: 'ABs', foreignKey: 'id_A'} );

const a = await A.create({ 
    id: 1,
    ABs: [{ id_B: 22 }]
}, {
    include: [{
        model: AB,
        as: 'ABs'
    }]
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...