Adapter
The BaseModel class DOES NOT interact with the query builders directly. Instead, it relies on the Model adapter class to construct the query builder instances for different database operation.
This separation allows you swap the adapter with your custom implementation to cover advanced use cases.
Creating a custom adapter
Every custom adapter must adhere to the AdapterContract
interface.
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {}
You can assign the adapter to the model as follows:
class User extends BaseModel {
public static $adapter = new MyAdapter()
}
Methods/Properties
Following is the list of methods/properties that every adapter must have.
modelConstructorClient
Returns the query client for a given model constructor.
import { AdapterContract, ModelAdapterOptions } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public modelConstructorClient(model: typeof BaseModel, options?: ModelAdapterOptions) {
const connection = options?.connection || model.connection
return connection ? Database.connection(connection) : Database.connection()
}
}
modelClient
Returns the query client for a given model instance. The default implementation resolves the client as follows
- Return the transaction client if the model has
$trx
property defined - Return the query client for a given connection if model instance has
$options.connection
property defined. - Finally, look for the
connection
property on the model constructor (aka static connection property).
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public modelClient(instance: BaseModel) {
}
}
query
Return the query builder instance for a given Model constructor. The Model.query
method internals calls the query
method on the adapter.
import { AdapterContract, ModelAdapterOptions } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public query(model: typeof BaseModel, options?: ModelAdapterOptions) {
return Database.modelQuery(model)
}
}
insert
Perform the insert operation for a given model instance. The method receives the model instance and an object of attributes to insert.
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public async insert(instance: BaseModel, attributes: any) {
}
}
update
Perform the update operation for a given model instance. The method receives the model instance and an object of attributes to update.
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public async update(instance: BaseModel, dirtyAttributes: any) {
}
}
delete
Perform the delete operation for a given model instance. The method receives only the model instance.
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public async delete(instance: BaseModel) {
}
}
refresh
Refresh the model instance by performing a select query and hydrating its attributes. The method receives only the model instance.
import { AdapterContract } from '@ioc:Adonis/Lucid/Orm'
class MyAdapter implements AdapterContract {
public async refresh(instance: BaseModel) {
}
}