序列化-使用嵌套实体上的条件搜索查询

时间:2018-09-10 15:25:48

标签: postgresql sequelize.js

我正在使用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),以检索以下帐户:

  • Compte.email是ILIKE:“%” + searchText +“%”
  • OR
  • Compte.derniereRevision.nom是ILIKE:“%” + searchText +“%”
  • OR
  • Compte.derniereRevision.prenom为ILIKE:“%” + 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之类的嵌套实体的条件来执行此类查找请求。

1 个答案:

答案 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