Belongs to
A classe de relacionamento BelongsTo gerencia o pertence ao relacionamento entre dois modelos.
Você não se verá trabalhando diretamente com esta classe. No entanto, uma instância da classe pode ser acessada usando o método Model.$getRelation.
import { BaseModel, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'
import User from 'App/Models/User'
class Post extends BaseModel {
@belongsTo(() => User)
public author: BelongsTo<typeof User>
}Post.$getRelation('author').relationName
Post.$getRelation('author').type
Post.$getRelation('author').relatedModel()Métodos/Propriedades
A seguir está a lista de métodos e propriedades disponíveis no relacionamento BelongsTo.
type
O tipo do relacionamento. O valor é sempre definido como belongsTo.
class Post extends BaseModel {
@belongsTo(() => User)
public author: BelongsTo<typeof User>
}
Post.$getRelation('author').type // 'belongsTo'relationName
O nome do relacionamento. É um nome de propriedade definido no modelo pai.
class Post extends BaseModel {
@belongsTo(() => User)
public author: BelongsTo<typeof User>
}
Post.$getRelation('author').relationName // 'author'serializeAs
O nome a ser usado para serializar o relacionamento. Você pode defini-lo usando as opções do decorador.
class Post extends BaseModel {
@belongsTo(() => User, {
serializeAs: 'user'
})
public author: BelongsTo<typeof User>
}booted
Descubra se o relacionamento foi inicializado. Caso contrário, chame o método boot.
boot
Inicialize o relacionamento. As APIs públicas dos modelos Lucid chamam esse método internamente, e você nunca precisa inicializar o relacionamento manualmente.
model
Referência ao modelo pai (aquele que define o relacionamento).
class Post extends BaseModel {
@belongsTo(() => User)
public author: BelongsTo<typeof User>
}
Post.$getRelation('author').model // PostrelatedModel
Referência ao modelo de relacionamento. O valor da propriedade é uma função que retorna o modelo relacionado.
class Post extends BaseModel {
@belongsTo(() => User)
public author: BelongsTo<typeof User>
}
Post.$getRelation('author').relatedModel() // UserlocalKey
A localKey para o relacionamento. Você deve ler o documento NamingStrategy para saber mais sobre como o nome da chave é computado.
Você também pode definir a localKey explicitamente. Certifique-se de mencionar o nome da propriedade do modelo e NÃO o nome da coluna do banco de dados.
class Post extends BaseModel {
@belongsTo(() => User, {
localKey: 'id', //coluna id no modelo "Usuário"
})
public author: BelongsTo<typeof User>
}foreignKey
A foreignKey para o relacionamento. Você deve ler o documento NamingStrategy para saber mais sobre como o nome da chave é computado.
Você também pode definir a foreignKey explicitamente. Certifique-se de mencionar o nome da propriedade do modelo e NÃO o nome da coluna do banco de dados.
class Post extends BaseModel {
@column()
public userId: number
@belongsTo(() => User, {
foreignKey: 'userId', // coluna userId no modelo "Post"
})
public author: BelongsTo<typeof User>
}onQuery
O método onQuery é um gancho opcional para modificar as consultas de relacionamento. Você pode defini-lo no momento da declaração da relação.
class Post extends BaseModel {
@column()
public userId: number
@belongsTo(() => User, {
onQuery(query) {
query.where('accountStatus', 'active')
}
})
public author: BelongsTo<typeof User>
}Se você quiser pré-carregar um relacionamento aninhado usando o gancho onQuery, certifique-se de colocá-lo dentro do condicional !query.isRelatedSubQuery porque as subconsultas NÃO são executadas diretamente, elas são usadas dentro de outras consultas.
class Post extends BaseModel {
@column()
public userId: number
@belongsTo(() => User, {
onQuery(query) {
if (!query.isRelatedSubQuery) {
query.preload('profile')
}
}
})
public author: BelongsTo<typeof User>
}setRelated
Defina um relacionamento na instância do modelo pai. Os métodos aceitam o modelo pai como o primeiro argumento e a instância do modelo relacionada como o segundo argumento.
Você deve garantir que ambas as instâncias do modelo estejam relacionadas entre si antes de chamar este método.
const user = new User()
const post = new Post()
Post.$getRelation('author').setRelated(user, post)pushRelated
O método pushRelated envia o relacionamento para a matriz de valores de relacionamento existente. No entanto, para o relacionamento belongsTo, o método funciona de forma semelhante a setRelated.
setRelatedForMany
Defina os relacionamentos em mais de um modelo pai. O método aceita uma matriz dos modelos pais como o primeiro argumento e uma matriz de modelos relacionados como o segundo argumento.
O Lucid chama isso internamente com os resultados do pré-carregador.
const users = [
User {
id: 1,
},
User {
id: 2,
},
User {
id: 3,
}
]
const posts = [
Post {
id: 1,
userId: 1,
},
Post {
id: 2,
userId: 1,
},
Post {
id: 3,
userId: 3,
},
Post {
id: 4,
userId: 2,
},
]
Post.$getRelation('author').setRelatedForMany(posts, users)client
Retorna a referência para BelongsToQueryClient. O cliente de consulta expõe a API para persistir/buscar linhas relacionadas do banco de dados.
hydrateForPersistance
Hidrata os valores para persistência definindo o valor foreignKey. O método aceita o modelo pai como o primeiro argumento e um objeto ou a instância do modelo relacionado como o segundo argumento.
const user = new User()
user.id = 1
const post = new Post()
post.title = 'Adonis 101'
Post.$getRelation('author').hydrateForPersistance(post, user)
console.log(post.userId === user.id) // trueeagerQuery
Retorna uma instância do BelongsToQueryBuilder. O construtor de consultas tem a mesma API que o Construtor de consultas do modelo
subQuery
Retorna uma instância do BelongsToSubQueryBuilder. As subconsultas não devem ser executadas e usadas principalmente pelos métodos withCount e whereHas.
Cliente de consulta
O cliente de consulta expõe a API para persistir/buscar linhas relacionadas do banco de dados. Você pode acessar o cliente de consulta para um relacionamento usando o método related.
const post = await Post.find(1)
post.related('author') // BelongsToClientContractassociate
Associe o modelo relacionado ao modelo pai. Por exemplo, associe o usuário à postagem.
const user = await User.find(1)
const post = await Post.find(1)
await post
.related('author')
.associate(user)O método associate herda o cliente de transação ou o nome da conexão definido na instância do modelo pai. Por exemplo:
const trx = await Database.transaction()
const post = await Post.query({ client: trx }).first()
const user = await User.query({ client: trx }).first()
/**
* Usa a propriedade `$trx` da instância `post` para
* persistir o relacionamento
*/
await post.related('author').associate(user)
await trx.commit()dissociate
O método dissociate remove o relacionamento definindo o valor da chave estrangeira como null.
const post = await Post.find(1)
await post.dissociate()
post.userId // nullquery
Retorna uma instância do BelongsToQueryBuilder. O construtor de consultas tem a mesma API que o Construtor de consultas do modelo.