Version: Next

Frequently Asked Questions

How can I synchronize my database schema with the entities?

There are two ways:

npx mikro-orm schema:update --run

I cannot run the CLI

Make sure you install @mikro-orm/cli package locally. If you want to have global installation, you will need to install driver packages globally too.

EntityManager does not have createQueryBuilder() method

The method is there, the issue is in the TS type.

In v4 the core package, where EntityManager and EntityRepository are defined, is not dependent on knex, and therefore it cannot have a method returning a QueryBuilder. You need to import the SQL flavour of the EM from the driver package to access the createQueryBuilder() method.

The SQL flavour of EM is actually called SqlEntityManager, it is exported both under this name and under EntityManager alias, so you can just change the location from where you import.

import { EntityManager } from '@mikro-orm/mysql'; // or any other SQL driver package
const em: EntityManager;
const qb = await em.createQueryBuilder(...);

Same applies for the aggregate() method in mongo driver:

import { EntityManager } from '@mikro-orm/mongodb';
const em: EntityManager;
const ret = await em.aggregate(...);

The mongo flavour of EM is actually called MongoEntityManager, it is exported both under this name and under EntityManager alias, so you can just change the location from where you import.

How can I add columns to pivot table (M:N relation)

You should model your M:N relation transparently, via 1:m and m:1 properties. More about this can be found in Composite Keys section.

You cannot call em.flush() from inside lifecycle hook handlers

You might see this validation error even if you do not use hooks. If that happens, the reason is usually because you do not have request context set up properly, and you are reusing one EntityManager instance.

Column is being created with JSON type while the TS type is string/Date/number/...

You are probably using the default ReflectMetadataProvider, which does not support inferring property type when there is a property initializer.

@Property()
foo = 'abc';

There are two ways around this:

@Property()
foo: string = 'abc';
Last updated on by Martin Adámek