undeexcepturi
Version:
TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.
120 lines (99 loc) • 3.16 kB
text/typescript
import { Collection, Entity, OneToMany, ManyToOne, MikroORM, PrimaryKey } from '@mikro-orm/better-sqlite';
()
export class Collector {
()
id!: number;
({
entity: 'Collect',
mappedBy: 'collector',
})
collecting = new Collection<Collect>(this);
}
()
export class Collectable {
()
id!: number;
({
entity: 'Collect',
mappedBy: 'collectable',
})
collectors = new Collection<Collect>(this);
}
()
export class Collect {
()
id!: number;
()
collector?: Collector;
()
collectable?: Collectable;
}
let orm: MikroORM;
beforeAll(async () => {
orm = await MikroORM.init({
entities: [Collect, Collector, Collectable],
dbName: ':memory:',
});
await orm.schema.createSchema();
});
afterAll(() => orm.close(true));
describe('GH issue #3301', () => {
test('select with $or on 1:m and m:1 auto-joined relation', () => {
const query = {
$or: [{
collecting: {
collectable: { id: 1 },
},
}, {
collecting: {
collectable: { id: { $eq: 2 } },
},
}],
};
const expected = 'select `c0`.* from `collector` as `c0` ' +
'left join `collect` as `c1` on `c0`.`id` = `c1`.`collector_id` ' +
'where (`c1`.`collectable_id` = 1 or `c1`.`collectable_id` = 2)';
const sql1 = orm.em.createQueryBuilder(Collector).select('*').where(query).getFormattedQuery();
expect(sql1).toBe(expected);
const sql2 = orm.em.createQueryBuilder(Collector).where(query).getFormattedQuery();
expect(sql2).toBe(expected);
});
test('select 1:m auto-joined relation with $or on m:1 auto-joined relation', () => {
const query = {
collecting: {
$or: [
{ collectable: { id: 1 } },
{ collectable: { id: { $eq: 2 } } },
],
},
};
const expected = 'select `c0`.* from `collector` as `c0` ' +
'left join `collect` as `c1` on `c0`.`id` = `c1`.`collector_id` ' +
'where (`c1`.`collectable_id` = 1 or `c1`.`collectable_id` = 2)';
const sql1 = orm.em.createQueryBuilder(Collector).select('*').where(query).getFormattedQuery();
expect(sql1).toBe(expected);
const sql2 = orm.em.createQueryBuilder(Collector).where(query).getFormattedQuery();
expect(sql2).toBe(expected);
});
test('select 1:m and m:1 auto-joined relation with $or', () => {
const query = {
collecting: {
collectable: {
$or: [{
id: 1,
}, {
id: { $eq: 2 },
}],
},
},
};
const expected = 'select `c0`.* from `collector` as `c0` ' +
'left join `collect` as `c1` on `c0`.`id` = `c1`.`collector_id` ' +
'left join `collectable` as `c2` on `c1`.`collectable_id` = `c2`.`id` ' +
'where (`c2`.`id` = 1 or `c2`.`id` = 2)';
const sql1 = orm.em.createQueryBuilder(Collector).select('*').where(query).getFormattedQuery();
expect(sql1).toBe(expected);
const sql2 = orm.em.createQueryBuilder(Collector).where(query).getFormattedQuery();
expect(sql2).toBe(expected);
});
});