mirror of
https://github.com/nocobase/nocobase
synced 2024-11-15 10:26:45 +00:00
chore(database): sort many to many associations by primary key by … (#1948)
* chore(database): sort belongs to many associations by primary key by default * chore: test * chore: force sync in test
This commit is contained in:
parent
ebae59507f
commit
82e6c7bb40
@ -15,6 +15,100 @@ describe('Eager loading tree', () => {
|
|||||||
await db.close();
|
await db.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should sort has many default by primary key', async () => {
|
||||||
|
const Source = db.collection({
|
||||||
|
name: 'source',
|
||||||
|
fields: [
|
||||||
|
{ type: 'string', name: 'name' },
|
||||||
|
{
|
||||||
|
type: 'hasMany',
|
||||||
|
name: 'targets',
|
||||||
|
target: 'target',
|
||||||
|
foreignKey: 'source_id',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const Target = db.collection({
|
||||||
|
name: 'target',
|
||||||
|
fields: [{ type: 'integer', name: 'seq_number' }],
|
||||||
|
});
|
||||||
|
|
||||||
|
await db.sync();
|
||||||
|
|
||||||
|
const target1 = await Target.repository.create({ values: { seq_number: 1 } });
|
||||||
|
const target2 = await Target.repository.create({ values: { seq_number: 3 } });
|
||||||
|
|
||||||
|
await target1.update({ values: { seq_number: 2 } });
|
||||||
|
|
||||||
|
await Source.repository.create({
|
||||||
|
values: { name: 's1', targets: [{ id: target2.get('id') }, { id: target1.get('id') }] },
|
||||||
|
});
|
||||||
|
|
||||||
|
const source = await Source.repository.findOne({
|
||||||
|
appends: ['targets'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(source.get('targets').map((item: any) => item.get('id'))).toEqual([1, 2]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should sort belongs to many default by target primary key', async () => {
|
||||||
|
const Through = db.collection({
|
||||||
|
name: 'through',
|
||||||
|
fields: [{ type: 'string', name: 'name' }],
|
||||||
|
});
|
||||||
|
|
||||||
|
const Source = db.collection({
|
||||||
|
name: 'source',
|
||||||
|
fields: [
|
||||||
|
{ type: 'string', name: 'name' },
|
||||||
|
{
|
||||||
|
type: 'belongsToMany',
|
||||||
|
name: 'targets',
|
||||||
|
target: 'target',
|
||||||
|
through: 'through',
|
||||||
|
foreignKey: 'source_id',
|
||||||
|
otherKey: 'target_id',
|
||||||
|
sourceKey: 'id',
|
||||||
|
targetKey: 'id',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const Target = db.collection({
|
||||||
|
name: 'target',
|
||||||
|
fields: [{ type: 'integer', name: 'seq_number' }],
|
||||||
|
});
|
||||||
|
|
||||||
|
await db.sync({
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const targets = await Target.repository.create({
|
||||||
|
values: [
|
||||||
|
{ seq_number: 1 },
|
||||||
|
{ seq_number: 2 },
|
||||||
|
{ seq_number: 3 },
|
||||||
|
{ seq_number: 4 },
|
||||||
|
{ seq_number: 5 },
|
||||||
|
{ seq_number: 6 },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
await Source.repository.create({
|
||||||
|
values: {
|
||||||
|
name: 'source1',
|
||||||
|
targets: [targets[2], targets[0], targets[1]],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const source = await Source.repository.findOne({
|
||||||
|
appends: ['targets'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(source.targets.map((t) => t.get('id'))).toEqual([1, 2, 3]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should handle eager loading with long field', async () => {
|
it('should handle eager loading with long field', async () => {
|
||||||
const Through = db.collection({
|
const Through = db.collection({
|
||||||
name: 'abc_abcd_abcd_abcdefg_abc_abc_a_abcdefghijk',
|
name: 'abc_abcd_abcd_abcdefg_abc_abc_a_abcdefghijk',
|
||||||
|
@ -103,6 +103,17 @@ export class EagerLoadingTree {
|
|||||||
async load(pks: Array<string | number>, transaction?: Transaction) {
|
async load(pks: Array<string | number>, transaction?: Transaction) {
|
||||||
const result = {};
|
const result = {};
|
||||||
|
|
||||||
|
const orderOption = (association) => {
|
||||||
|
const targetModel = association.target;
|
||||||
|
const order = [];
|
||||||
|
|
||||||
|
if (targetModel.primaryKeyAttribute && targetModel.rawAttributes[targetModel.primaryKeyAttribute].autoIncrement) {
|
||||||
|
order.push([targetModel.primaryKeyAttribute, 'ASC']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return order;
|
||||||
|
};
|
||||||
|
|
||||||
const loadRecursive = async (node, ids) => {
|
const loadRecursive = async (node, ids) => {
|
||||||
const modelPrimaryKey = node.model.primaryKeyAttribute;
|
const modelPrimaryKey = node.model.primaryKeyAttribute;
|
||||||
|
|
||||||
@ -134,6 +145,7 @@ export class EagerLoadingTree {
|
|||||||
const findOptions = {
|
const findOptions = {
|
||||||
where: { [foreignKey]: foreignKeyValues },
|
where: { [foreignKey]: foreignKeyValues },
|
||||||
attributes: node.attributes,
|
attributes: node.attributes,
|
||||||
|
order: orderOption(association),
|
||||||
transaction,
|
transaction,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -174,6 +186,7 @@ export class EagerLoadingTree {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
order: orderOption(association),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user