我正在使用Sequelize和Posgresql。我也在使用sequelize-typescript。
我有一个像Compte这样的模型:
export class Compte extends Model<Compte> {
@ForeignKey(() => CompteRevision)
@Column
derniereRevisionId: number;
@BelongsTo(() => CompteRevision, 'derniereRevisionId')
public derniereRevision: CompteRevision;
@Unique
@AllowNull(false)
@Column(DataType.STRING)
public email: string;
}
和CompteRevision一样:
export class CompteRevision extends Model<CompteRevision> {
@Column(DataType.BIGINT)
public compteId: number;
@Column(DataType.STRING)
public nom: string;
@Column(DataType.STRING)
public prenom: string;
}
我正在尝试发出搜索请求(基于字符串searchText),以检索以下帐户:
在找到关于SO的许多答案之后,我尝试这样做:
public async search(searchText: string): Promise<Array<Compte>> {
return Compte.findAll({
where: {
email: { [Server.sequelize.Op.iLike]: "%" + searchText + "%" }
},
include: [{
model: CompteRevision, where: {
nom: { [Server.sequelize.Op.iLike]: "%" + searchText + "%" },
prenom: { [Server.sequelize.Op.iLike]: "%" + searchText + "%" }
}
}]
});
}
但是我不确定include子句在做什么。实际上,此方法总是返回一个空数组。有人知道如何通过检查诸如CompteRevision之类的嵌套实体的条件来执行此类查找请求。
答案 0 :(得分:0)
您在这里:
return Compte.findAll({
where: {
$or : [
{ email: { $iLike : "%" + searchText + "%" } },
{ '$derniereRevision.nom$' : { $iLike : "%" + searchText + "%" }, }, // <--- Magic is here
{ '$derniereRevision.prenom$' : { $iLike : "%" + searchText + "%" } } // <--- Magic is here
]
},
include: [{
model: CompteRevision
}]
});
注释:
$CompteRevision.nom$
,$table_name.column$
语法用于查询 包含表,没有$$
序列化将不视为表 带列的名称。用您的表名更改此CompteRevision
当您在包含模型内部进行查询时,它将与 包含表,要使其左连接,您可以使用
required:false
, 但不是您这里需要的情况代替使用
Server.sequelize.Op.iLike
长语法,您可以使用 简短运算符$iLike
, read more