title |
---|
Frequently Asked Questions |
There are two ways:
npx mikro-orm schema:update --run
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.
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 underEntityManager
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 = orm.em as EntityManager;
const qb = await em.createQueryBuilder(...);
To have the orm.em
variable properly typed, you have to import the MikroORM
from your driver package:
import { MikroORM } from '@mikro-orm/mysql'; // or any other SQL driver package
const orm = await MikroORM.init({
// ...
});
console.log(orm.em); // access EntityManager via `em` property
Same applies for the aggregate()
method in mongo driver:
import { EntityManager } from '@mikro-orm/mongodb';
const em = orm.em as EntityManager;
const ret = await em.aggregate(...);
The mongo flavour of EM is actually called
MongoEntityManager
, it is exported both under this name and underEntityManager
alias, so you can just change the location from where you import.
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 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.
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:
- Use TsMorphMetadataProvider
- Specify the type explicitly:
@Property()
foo: string = 'abc';
There are several ways:
- Using references:
const b = new Book();
b.author = em.getReference(Author, 1);
- Using assign helper:
const b = new Book();
em.assign(b, { author: 1 });
- Using create helper:
const b = em.create(Book, { author: 1 });
When creating new entity instances, either with new Book()
or em.create(Book, {})
, MikroORM should return:
Book {}
But some users might find that this returns an object with properties that are explicitly set to undefined
:
Book {
name: undefined,
author: undefined,
createdAt: undefined
}
This can cause unexpected behavior, particularly if you're expecting the database to set a default value for a column.
To fix this, disable the useDefineForClassFields
option in your tsconfig:
{
"compilerOptions": {
"useDefineForClassFields": false
}
}
There are two methods you can use to check the database status, they live on the Connection
class and both have a shortcut on the MikroORM
class too:
// boolean
const isConnected = await orm.isConnected();
// object with `ok`, `reason` and `error` keys
const check = await orm.checkConnection();
console.log(check.ok, check.reason);