Construtor de consultas
O construtor de consultas Lucid permite que você escreva e execute consultas SQL. Ele é construído em cima do Knex.js com poucas alterações opinativas.
Nós dividimos os construtores de consultas nas seguintes categorias
- O construtor de consultas padrão permite que você construa consultas SQL para operações select, update e delete.
- O construtor de consultas insert permite que você construa consultas SQL para as operações insert.
- O construtor de consultas raw permite que você escreva e execute consultas a partir de uma string SQL raw.
Consultas select
Você pode executar operações select criando uma instância do construtor de consultas usando o método .query.
import Database from '@ioc:Adonis/Lucid/Database'
const users = await Database
.query() // 👈 fornece uma instância do construtor de consultas select
.from('users')
.select('*')Você também pode criar a instância do construtor de consultas chamando diretamente o método .from.
import Database from '@ioc:Adonis/Lucid/Database'
const users = await Database
.from('users') // 👈 fornece uma instância do construtor de consultas select
.select('*')Guia de referência do construtor de consultas →
Consultas de inserção
O construtor de consultas de inserção expõe a API para inserir novas linhas no banco de dados. Você pode obter uma instância do construtor de consultas usando o método .insertQuery.
import Database from '@ioc:Adonis/Lucid/Database'
await Database
.insertQuery() // 👈 fornece uma instância do construtor de consulta de inserção
.table('users')
.insert({ username: 'virk', email: 'virk@adonisjs.com' })Você também pode criar a instância do construtor de consultas chamando diretamente o método .table.
await Database
.table('users') // 👈 fornece uma instância do construtor de consulta de inserção
.insert({ username: 'virk', email: 'virk@adonisjs.com' })Inserção múltipla
Você pode usar o método .multiInsert para inserir várias linhas em uma única consulta de inserção.
NOTA
MySQL e SQLite retornam apenas o id da última linha e não de todas as linhas.
await Database.table('users').multiInsert([
{ username: 'virk' },
{ username: 'romain' },
])Consultas brutas
Consultas brutas permitem executar uma instrução SQL a partir de uma entrada de string. Isso geralmente é útil quando você deseja executar consultas complexas que não são suportadas pelo construtor de consultas padrão.
Você pode criar uma instância do construtor de consultas brutas usando o método .rawQuery. Ele aceita a string SQL como o primeiro argumento e suas ligações posicionais/nomeadas como o segundo argumento.
import Database from '@ioc:Adonis/Lucid/Database'
const user = await Database
.rawQuery('select * from users where id = ?', [1])Estendendo construtores de consultas
Você pode estender as classes do construtor de consultas usando macros e getters. O melhor lugar para estender os construtores de consultas é dentro de um provedor de serviços personalizado.
Abra o arquivo providers/AppProvider.ts pré-existente e escreva o seguinte código dentro do método boot.
import { ApplicationContract } from '@ioc:Adonis/Core/Application'
export default class AppProvider {
constructor(protected app: ApplicationContract) {}
public async boot() {
const {
DatabaseQueryBuilder
} = this.app.container.use('Adonis/Lucid/Database')
DatabaseQueryBuilder.macro('getCount', async function () {
const result = await this.count('* as total')
return BigInt(result[0].total)
})
}
}No exemplo acima, adicionamos um método getCount no construtor de consultas de banco de dados. O método adiciona uma função count à consulta, executa-a imediatamente e retorna o resultado como um BigInt.
Informando o TypeScript sobre o método
A propriedade getCount é adicionada no tempo de execução e, portanto, o TypeScript não sabe sobre ela. Para informar o TypeScript, usaremos declaration merging e adicionaremos a propriedade à interface DatabaseQueryBuilderContract.
Crie um novo arquivo no caminho contracts/database.ts (o nome do arquivo não é importante) e cole o seguinte conteúdo dentro dele.
// contracts/database.ts
declare module '@ioc:Adonis/Lucid/Database' {
interface DatabaseQueryBuilderContract<Result> {
getCount(): Promise<BigInt>
}
}Execução de teste
Vamos tentar usar o método getCount da seguinte forma:
await Database.query().from('users').getCount()Estendendo ModelQueryBuilder
Semelhante ao DatabaseQueryBuilder, você também pode estender o ModelQueryBuilder da seguinte forma.
Código de tempo de execução
const {
ModelQueryBuilder
} = this.app.container.use('Adonis/Lucid/Database')
ModelQueryBuilder.macro('getCount', async function () {
const result = await this.count('* as total')
return BigInt(result[0].$extras.total)
})Estendendo a definição de tipo
declare module '@ioc:Adonis/Lucid/Orm' {
interface ModelQueryBuilderContract<
Model extends LucidModel,
Result = InstanceType<Model>
> {
getCount(): Promise<BigInt>
}
}Uso
import User from 'App/Models/User'
await User.query().getCount()Estendendo InsertQueryBuilder
Finalmente, você também pode estender o InsertQueryBuilder da seguinte forma.
Código de tempo de execução
const {
InsertQueryBuilder
} = this.app.container.use('Adonis/Lucid/Database')
InsertQueryBuilder.macro('customMethod', async function () {
// implementação
})Estendendo a definição de tipo
declare module '@ioc:Adonis/Lucid/Database' {
interface InsertQueryBuilderContract<Result = any> {
customMethod(): Promise<any>
}
}Uso
import Database from '@ioc:Adonis/Lucid/Database'
await Database.insertQuery().customMethod()