@mikro-orm/knex 6.0.0-dev.267 → 6.0.0-dev.269

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,7 +40,7 @@ export declare abstract class AbstractSqlConnection extends Connection {
40
40
  }): Promise<Knex.Transaction>;
41
41
  commit(ctx: Knex.Transaction, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
42
42
  rollback(ctx: Knex.Transaction, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
43
- execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(queryOrKnex: string | Knex.QueryBuilder | Knex.Raw, params?: unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, logging?: LoggingOptions): Promise<T>;
43
+ execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(queryOrKnex: string | Knex.QueryBuilder | Knex.Raw, params?: unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, loggerContext?: LoggingOptions): Promise<T>;
44
44
  /**
45
45
  * Execute raw SQL queries from file
46
46
  */
@@ -106,7 +106,7 @@ class AbstractSqlConnection extends core_1.Connection {
106
106
  await eventBroadcaster?.dispatchEvent(core_1.EventType.afterTransactionRollback, ctx);
107
107
  }
108
108
  }
109
- async execute(queryOrKnex, params = [], method = 'all', ctx, logging) {
109
+ async execute(queryOrKnex, params = [], method = 'all', ctx, loggerContext) {
110
110
  await this.ensureConnection();
111
111
  if (core_1.Utils.isObject(queryOrKnex)) {
112
112
  ctx ??= (queryOrKnex.client.transacting ? queryOrKnex : null);
@@ -115,7 +115,7 @@ class AbstractSqlConnection extends core_1.Connection {
115
115
  params = q.bindings;
116
116
  }
117
117
  const formatted = this.platform.formatQuery(queryOrKnex, params);
118
- const sql = this.getSql(queryOrKnex, formatted, logging);
118
+ const sql = this.getSql(queryOrKnex, formatted, loggerContext);
119
119
  return this.executeQuery(sql, async () => {
120
120
  const query = this.getKnex().raw(formatted);
121
121
  if (ctx) {
@@ -123,7 +123,7 @@ class AbstractSqlConnection extends core_1.Connection {
123
123
  }
124
124
  const res = await query;
125
125
  return this.transformRawResult(res, method);
126
- }, { query: queryOrKnex, params, ...logging });
126
+ }, { query: queryOrKnex, params, ...loggerContext });
127
127
  }
128
128
  /**
129
129
  * Execute raw SQL queries from file
@@ -35,7 +35,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
35
35
  /**
36
36
  * 1:1 owner side needs to be marked for population so QB auto-joins the owner id
37
37
  */
38
- protected autoJoinOneToOneOwner<T extends object, P extends string = never>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], fields?: readonly EntityField<T, P>[]): PopulateOptions<T>[];
38
+ protected autoJoinOneToOneOwner<T extends object, P extends string = never>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], fields?: readonly EntityField<T, any>[]): PopulateOptions<T>[];
39
39
  /**
40
40
  * @internal
41
41
  */
@@ -55,7 +55,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
55
55
  */
56
56
  mapPropToFieldNames<T extends object>(qb: QueryBuilder<T>, prop: EntityProperty<T>, tableAlias?: string): Field<T>[];
57
57
  /** @internal */
58
- createQueryBuilder<T extends object>(entityName: EntityName<T> | QueryBuilder<T>, ctx?: Transaction<Knex.Transaction>, preferredConnectionType?: ConnectionType, convertCustomTypes?: boolean, logging?: LoggingOptions): QueryBuilder<T>;
58
+ createQueryBuilder<T extends object>(entityName: EntityName<T> | QueryBuilder<T>, ctx?: Transaction<Knex.Transaction>, preferredConnectionType?: ConnectionType, convertCustomTypes?: boolean, loggerContext?: LoggingOptions): QueryBuilder<T>;
59
59
  protected resolveConnectionType(args: {
60
60
  ctx?: Transaction<Knex.Transaction>;
61
61
  connectionType?: ConnectionType;
@@ -217,9 +217,9 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
217
217
  }
218
218
  return;
219
219
  }
220
- const relationPojo = {};
220
+ let relationPojo = {};
221
221
  meta2.props
222
- .filter(prop => prop.persist === false && prop.fieldNames)
222
+ .filter(prop => !ref && prop.persist === false && prop.fieldNames)
223
223
  .filter(prop => !prop.lazy || populate.some(p => p.field === prop.name || p.all))
224
224
  .forEach(prop => {
225
225
  /* istanbul ignore if */
@@ -231,7 +231,9 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
231
231
  relationPojo[prop.name] = root[alias];
232
232
  }
233
233
  });
234
- const props = meta2.props.filter(prop => this.platform.shouldHaveColumn(prop, hint.children || []));
234
+ const props = ref
235
+ ? meta2.getPrimaryProps()
236
+ : meta2.props.filter(prop => this.platform.shouldHaveColumn(prop, hint.children || []));
235
237
  for (const prop1 of props) {
236
238
  if (prop1.fieldNames.length > 1) { // composite keys
237
239
  const fk = prop1.fieldNames.map(name => root[`${relationAlias}__${name}`]);
@@ -251,6 +253,10 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
251
253
  for (const prop1 of props) {
252
254
  prop1.fieldNames.map(name => delete root[`${relationAlias}__${name}`]);
253
255
  }
256
+ if (ref) {
257
+ const tmp = Object.values(relationPojo);
258
+ relationPojo = meta2.compositePK ? tmp : tmp[0];
259
+ }
254
260
  if ([core_1.ReferenceKind.MANY_TO_MANY, core_1.ReferenceKind.ONE_TO_MANY].includes(prop.kind)) {
255
261
  result[prop.name] ??= [];
256
262
  result[prop.name].push(relationPojo);
@@ -764,8 +770,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
764
770
  return false;
765
771
  }
766
772
  if (ref) {
767
- // keep only pivot ref joins here, as that only triggers actual join
768
- return prop.kind === core_1.ReferenceKind.MANY_TO_MANY;
773
+ return [core_1.ReferenceKind.MANY_TO_MANY, core_1.ReferenceKind.ONE_TO_MANY].includes(prop.kind);
769
774
  }
770
775
  return ![core_1.ReferenceKind.SCALAR, core_1.ReferenceKind.EMBEDDED].includes(prop.kind);
771
776
  });
@@ -847,6 +852,9 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
847
852
  if (pivotRefJoin) {
848
853
  fields.push(...prop.joinColumns.map(col => qb.helper.mapper(`${tableAlias}.${col}`, qb.type, undefined, `${tableAlias}__${col}`)), ...prop.inverseJoinColumns.map(col => qb.helper.mapper(`${tableAlias}.${col}`, qb.type, undefined, `${tableAlias}__${col}`)));
849
854
  }
855
+ if (prop.kind === core_1.ReferenceKind.ONE_TO_MANY && ref) {
856
+ fields.push(...this.getFieldsForJoinedLoad(qb, meta2, prop.referencedColumnNames, hint.children, options, tableAlias, path));
857
+ }
850
858
  const childExplicitFields = explicitFields?.filter(f => core_1.Utils.isPlainObject(f)).map(o => o[prop.name])[0] || [];
851
859
  explicitFields?.forEach(f => {
852
860
  if (typeof f === 'string' && f.startsWith(`${prop.name}.`)) {
@@ -889,9 +897,9 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
889
897
  return prop.fieldNames;
890
898
  }
891
899
  /** @internal */
892
- createQueryBuilder(entityName, ctx, preferredConnectionType, convertCustomTypes, logging) {
900
+ createQueryBuilder(entityName, ctx, preferredConnectionType, convertCustomTypes, loggerContext) {
893
901
  const connectionType = this.resolveConnectionType({ ctx, connectionType: preferredConnectionType });
894
- const qb = new query_1.QueryBuilder(entityName, this.metadata, this, ctx, undefined, connectionType, undefined, logging);
902
+ const qb = new query_1.QueryBuilder(entityName, this.metadata, this, ctx, undefined, connectionType, undefined, loggerContext);
895
903
  if (!convertCustomTypes) {
896
904
  qb.unsetFlag(core_1.QueryFlag.CONVERT_CUSTOM_TYPES);
897
905
  }
@@ -1,5 +1,5 @@
1
1
  import type { Knex } from 'knex';
2
- import { EntityManager, type AnyEntity, type ConnectionType, type EntityData, type EntityName, type EntityRepository, type GetRepository, type QueryResult, type FilterQuery } from '@mikro-orm/core';
2
+ import { EntityManager, type AnyEntity, type ConnectionType, type EntityData, type EntityName, type EntityRepository, type GetRepository, type QueryResult, type FilterQuery, type LoggingOptions } from '@mikro-orm/core';
3
3
  import type { AbstractSqlDriver } from './AbstractSqlDriver';
4
4
  import { QueryBuilder } from './query';
5
5
  import type { SqlEntityRepository } from './SqlEntityRepository';
@@ -10,11 +10,11 @@ export declare class SqlEntityManager<D extends AbstractSqlDriver = AbstractSqlD
10
10
  /**
11
11
  * Creates a QueryBuilder instance
12
12
  */
13
- createQueryBuilder<T extends object>(entityName: EntityName<T> | QueryBuilder<T>, alias?: string, type?: ConnectionType): QueryBuilder<T>;
13
+ createQueryBuilder<T extends object>(entityName: EntityName<T> | QueryBuilder<T>, alias?: string, type?: ConnectionType, loggerContext?: LoggingOptions): QueryBuilder<T>;
14
14
  /**
15
15
  * Shortcut for `createQueryBuilder()`
16
16
  */
17
- qb<T extends object>(entityName: EntityName<T>, alias?: string, type?: ConnectionType): QueryBuilder<T>;
17
+ qb<T extends object>(entityName: EntityName<T>, alias?: string, type?: ConnectionType, loggerContext?: LoggingOptions): QueryBuilder<T>;
18
18
  /**
19
19
  * Returns configured knex instance.
20
20
  */
@@ -10,15 +10,15 @@ class SqlEntityManager extends core_1.EntityManager {
10
10
  /**
11
11
  * Creates a QueryBuilder instance
12
12
  */
13
- createQueryBuilder(entityName, alias, type) {
13
+ createQueryBuilder(entityName, alias, type, loggerContext) {
14
14
  const context = this.getContext();
15
- return new query_1.QueryBuilder(entityName, this.getMetadata(), this.getDriver(), context.getTransactionContext(), alias, type, context);
15
+ return new query_1.QueryBuilder(entityName, this.getMetadata(), this.getDriver(), context.getTransactionContext(), alias, type, context, loggerContext ?? context.loggerContext);
16
16
  }
17
17
  /**
18
18
  * Shortcut for `createQueryBuilder()`
19
19
  */
20
- qb(entityName, alias, type) {
21
- return this.createQueryBuilder(entityName, alias, type);
20
+ qb(entityName, alias, type, loggerContext) {
21
+ return this.createQueryBuilder(entityName, alias, type, loggerContext);
22
22
  }
23
23
  /**
24
24
  * Returns configured knex instance.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/knex",
3
- "version": "6.0.0-dev.267",
3
+ "version": "6.0.0-dev.269",
4
4
  "description": "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.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -66,6 +66,6 @@
66
66
  "@mikro-orm/core": "^5.9.2"
67
67
  },
68
68
  "peerDependencies": {
69
- "@mikro-orm/core": "6.0.0-dev.267"
69
+ "@mikro-orm/core": "6.0.0-dev.269"
70
70
  }
71
71
  }
@@ -38,7 +38,7 @@ export declare class QueryBuilder<T extends object = AnyEntity> {
38
38
  private readonly context?;
39
39
  private connectionType?;
40
40
  private readonly em?;
41
- private readonly logging?;
41
+ private readonly loggerContext?;
42
42
  get mainAlias(): Alias<T>;
43
43
  get alias(): string;
44
44
  get helper(): QueryBuilderHelper;
@@ -87,7 +87,7 @@ export declare class QueryBuilder<T extends object = AnyEntity> {
87
87
  /**
88
88
  * @internal
89
89
  */
90
- constructor(entityName: EntityName<T> | QueryBuilder<T>, metadata: MetadataStorage, driver: AbstractSqlDriver, context?: Knex.Transaction<any, any[]> | undefined, alias?: string, connectionType?: ConnectionType | undefined, em?: SqlEntityManager<AbstractSqlDriver<import("..").AbstractSqlConnection, AbstractSqlPlatform>> | undefined, logging?: LoggingOptions | undefined);
90
+ constructor(entityName: EntityName<T> | QueryBuilder<T>, metadata: MetadataStorage, driver: AbstractSqlDriver, context?: Knex.Transaction<any, any[]> | undefined, alias?: string, connectionType?: ConnectionType | undefined, em?: SqlEntityManager<AbstractSqlDriver<import("..").AbstractSqlConnection, AbstractSqlPlatform>> | undefined, loggerContext?: LoggingOptions | undefined);
91
91
  select(fields: Field<T> | Field<T>[], distinct?: boolean): SelectQueryBuilder<T>;
92
92
  addSelect(fields: Field<T> | Field<T>[]): SelectQueryBuilder<T>;
93
93
  distinct(): SelectQueryBuilder<T>;
@@ -31,7 +31,7 @@ class QueryBuilder {
31
31
  context;
32
32
  connectionType;
33
33
  em;
34
- logging;
34
+ loggerContext;
35
35
  get mainAlias() {
36
36
  this.ensureFromClause();
37
37
  return this._mainAlias;
@@ -88,13 +88,13 @@ class QueryBuilder {
88
88
  /**
89
89
  * @internal
90
90
  */
91
- constructor(entityName, metadata, driver, context, alias, connectionType, em, logging) {
91
+ constructor(entityName, metadata, driver, context, alias, connectionType, em, loggerContext) {
92
92
  this.metadata = metadata;
93
93
  this.driver = driver;
94
94
  this.context = context;
95
95
  this.connectionType = connectionType;
96
96
  this.em = em;
97
- this.logging = logging;
97
+ this.loggerContext = loggerContext;
98
98
  this.platform = this.driver.getPlatform();
99
99
  this.knex = this.driver.getConnection(this.connectionType).getKnex();
100
100
  if (alias) {
@@ -587,7 +587,7 @@ class QueryBuilder {
587
587
  }
588
588
  const write = method === 'run' || !this.platform.getConfig().get('preferReadReplicas');
589
589
  const type = this.connectionType || (write ? 'write' : 'read');
590
- const res = await this.driver.getConnection(type).execute(query.sql, query.bindings, method, this.context, this.logging);
590
+ const res = await this.driver.getConnection(type).execute(query.sql, query.bindings, method, this.context, this.loggerContext);
591
591
  const meta = this.mainAlias.metadata;
592
592
  if (!options.mapResults || !meta) {
593
593
  await this.em?.storeCache(this._cache, cached, res);