fix: through collection records should not be reset (#1377)
* fix: through collection records should not be reset * fix: test error
This commit is contained in:
parent
2d767be184
commit
47158e0282
@ -0,0 +1,66 @@
|
|||||||
|
import { Database } from '../database';
|
||||||
|
import { mockDatabase } from './';
|
||||||
|
|
||||||
|
describe('update through', () => {
|
||||||
|
let db: Database;
|
||||||
|
beforeEach(async () => {
|
||||||
|
db = mockDatabase();
|
||||||
|
await db.clean({ drop: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await db.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not be reset', async () => {
|
||||||
|
db.collection({
|
||||||
|
name: 'c',
|
||||||
|
autoGenId: true,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'id',
|
||||||
|
type: 'integer',
|
||||||
|
primaryKey: true,
|
||||||
|
autoIncrement: true,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
});
|
||||||
|
db.collection({
|
||||||
|
name: 'a',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
type: 'string',
|
||||||
|
name: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'belongsToMany',
|
||||||
|
name: 'b',
|
||||||
|
target: 'b',
|
||||||
|
through: 'c',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
db.collection({
|
||||||
|
name: 'b',
|
||||||
|
fields: [],
|
||||||
|
});
|
||||||
|
await db.sync();
|
||||||
|
const b = await db.getRepository('b').create({
|
||||||
|
values: {},
|
||||||
|
});
|
||||||
|
const a = await db.getRepository('a').create({
|
||||||
|
values: {
|
||||||
|
b: [b.toJSON()],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const c1 = await db.getRepository('c').findOne();
|
||||||
|
await db.getRepository('a').update({
|
||||||
|
filterByTk: a.id,
|
||||||
|
values: {
|
||||||
|
b: [b.toJSON()],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const c2 = await db.getRepository('c').findOne();
|
||||||
|
expect(c1.get('id')).toBe(c2.get('id'))
|
||||||
|
});
|
||||||
|
});
|
@ -6,7 +6,7 @@ import {
|
|||||||
HasOne,
|
HasOne,
|
||||||
Hookable,
|
Hookable,
|
||||||
ModelStatic,
|
ModelStatic,
|
||||||
Transactionable,
|
Transactionable
|
||||||
} from 'sequelize';
|
} from 'sequelize';
|
||||||
import { Model } from './model';
|
import { Model } from './model';
|
||||||
import { UpdateGuard } from './update-guard';
|
import { UpdateGuard } from './update-guard';
|
||||||
@ -402,6 +402,7 @@ export async function updateMultipleAssociation(
|
|||||||
|
|
||||||
const list1 = []; // to be setted
|
const list1 = []; // to be setted
|
||||||
const list2 = []; // to be added
|
const list2 = []; // to be added
|
||||||
|
const created = [];
|
||||||
for (const item of value) {
|
for (const item of value) {
|
||||||
if (isUndefinedOrNull(item)) {
|
if (isUndefinedOrNull(item)) {
|
||||||
continue;
|
continue;
|
||||||
@ -413,6 +414,11 @@ export async function updateMultipleAssociation(
|
|||||||
} else if (item.sequelize) {
|
} else if (item.sequelize) {
|
||||||
list1.push(item);
|
list1.push(item);
|
||||||
} else if (typeof item === 'object') {
|
} else if (typeof item === 'object') {
|
||||||
|
const targetKey = (association as any).targetKey || 'id';
|
||||||
|
if (item[targetKey]) {
|
||||||
|
created.push(item[targetKey]);
|
||||||
|
list1.push(item[targetKey]);
|
||||||
|
}
|
||||||
list2.push(item);
|
list2.push(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,8 +462,9 @@ export async function updateMultipleAssociation(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const addAccessor = association.accessors.add;
|
const addAccessor = association.accessors.add;
|
||||||
|
if (!created.includes(item[pk])) {
|
||||||
await model[addAccessor](item[pk], accessorOptions);
|
await model[addAccessor](item[pk], accessorOptions);
|
||||||
|
}
|
||||||
if (!recursive) {
|
if (!recursive) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user