Estratégia de nomenclatura
A classe NamingStrategy permite que você substitua os nomes convencionais usados pelo ORM. Por exemplo: em vez de usar snake_case para seus nomes de coluna, você pode fornecer sua própria estratégia de nomenclatura camelCase personalizada.
Toda estratégia de nomenclatura deve implementar o contrato NamingStrategyContract e definir todos os métodos necessários.
import { CamelCaseNamingStrategy } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
//... definir todos os métodos necessários
}Atribua a um modelo
class User extends BaseModel {
public static namingStrategy = new MyCustomNamingStrategy()
}Ou atribua diretamente ao modelo Base. Certifique-se de fazer isso apenas uma vez e importar o arquivo ao inicializar o framework.
import { BaseModel } from '@adonisjs/lucid/orm'
BaseModel.namingStrategy = new CamelCaseNamingStrategy()Métodos/Propriedades
A seguir está a lista de métodos/propriedades que você deve definir na classe de estratégia de nomenclatura.
tableName
Retorna o nome da tabela padrão para o modelo. A estratégia de nomenclatura padrão converte o nome do modelo para snake_case e o pluraliza.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
tableName(model: typeof BaseModel) {
return string.singular(string.snakeCase(model.name))
}
}columnName
Retorna o nome da coluna do banco de dados para uma determinada propriedade do modelo. A estratégia de nomenclatura padrão converte a propriedade do modelo para snake_case.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
columnName(_model: typeof BaseModel, propertyName: string) {
return string.snakeCase(propertyName)
}
}serializedName
Retorna o nome a ser usado ao serializar as propriedades do modelo para JSON. A estratégia de nomenclatura padrão converte a propriedade do modelo para snake_case.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
serializedName(_model: typeof BaseModel, propertyName: string) {
return string.snakeCase(propertyName)
}
}relationLocalKey
Retorna a chave local para um determinado relacionamento. O comportamento padrão é usar primaryKey como a chave local para todos os relacionamentos, exceto belongsTo.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
relationLocalKey(
relation: string,
model: typeof BaseModel,
relatedModel: typeof BaseModel
) {
if (relation === 'belongsTo') {
return relatedModel.primaryKey
}
return model.primaryKey
}
}relationForeignKey
Retorna a chave estrangeira para um determinado relacionamento. A estratégia de nomenclatura padrão combina os nomes de coluna modelName e primaryKey e os converte para camelCase.
NOTA
A foreignKey aponta para a propriedade do modelo e não para o nome da coluna do banco de dados. Derivamos o nome da coluna do banco de dados do nome da propriedade do modelo.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
relationForeignKey(
relation: string,
model: typeof BaseModel,
relatedModel: typeof BaseModel
) {
if (relation === 'belongsTo') {
return string.camelCase(`${relatedModel.name}_${relatedModel.primaryKey}`)
}
return string.camelCase(`${model.name}_${model.primaryKey}`)
}
}relationPivotTable
Retorna o nome da tabela dinâmica para o relacionamento manyToMany. A estratégia de nomenclatura padrão concatena os nomes do modelo e os classifica em ordem alfabética.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
relationPivotTable(
_relation: 'manyToMany',
model: typeof BaseModel,
relatedModel: typeof BaseModel
) {
return string.snakeCase(
[relatedModel.name, model.name]
.sort()
.join('_')
)
}
}relationPivotForeignKey
Retorna o nome da chave estrangeira dentro da tabela dinâmica. O método é invocado para ambos os modelos envolvidos em um relacionamento manyToMany.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
relationPivotForeignKey(
_relation: 'manyToMany',
model: typeof BaseModel
) {
return string.snakeCase(`${model.name}_${model.primaryKey}`)
}
}paginationMetaKeys
Retorna as chaves para gerar os metadados para o paginador. A estratégia de nomenclatura padrão usa nomes snake_case.
import string from '@adonisjs/core/helpers/string'
import { CamelCaseNamingStrategy, BaseModel } from '@adonisjs/lucid/orm'
class MyCustomNamingStrategy extends CamelCaseNamingStrategy {
paginationMetaKeys() {
return {
total: 'total',
perPage: 'per_page',
currentPage: 'current_page',
lastPage: 'last_page',
firstPage: 'first_page',
firstPageUrl: 'first_page_url',
lastPageUrl: 'last_page_url',
nextPageUrl: 'next_page_url',
previousPageUrl: 'previous_page_url',
}
}
}Se você estiver paginando resultados usando o serviço db diretamente, deverá registrar a estratégia de nomenclatura com a classe SimplePaginator.
import db from '@adonisjs/lucid/services/db'
db.SimplePaginator.namingStrategy = new MyCustomNamingStrategy()O exemplo acima configurará a estratégia de nomenclatura para o paginador globalmente. No entanto, você também pode definir a estratégia de nomenclatura para uma determinada chamada de método .paginate.
import db from '@adonisjs/lucid/services/db'
const paginator = await db.from('users').paginate()
paginator.namingStrategy = new CamelCaseNamingStrategy()
return paginator.toJSON()