【问题标题】:Sequelize - Search query with criteria on nested entitySequelize - 使用嵌套实体的条件搜索查询
【发布时间】:2018-09-10 15:25:47
【问题描述】:

我正在使用 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 + "%"
  • Compte.derniereRevision.nom 是 ILIKE : "%" + searchText + "%"
  • 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)的标准来执行此类查找请求。

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    给你:

    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$ 语法是查询 包含表,没有$$ sequelize 将不会被视为表 名称与列。用您的表名更改此 CompteRevision

    当您在 include model 内部进行查询时,它将与 包含表,要使其左连接,您可以使用required:false, 但这里不是你需要的情况

    不用Server.sequelize.Op.iLike long 语法,你可以使用 短运算符 $iLike , read more

    【讨论】:

    • 非常感谢,你拯救了我的一天!实际上,我必须将 '$CompteRevision.nom$' 更改为 '$derniereRevision.nom$' 才能使其正常工作,我将编辑您的答案以包含它并将其验证为好的答案。我的目的是发现文档中没有正确解释的魔法,而你做到了。
    • 关于 $iLike 别名,我知道出于安全原因,sequelize 建议不要使用它。根据您引用的文档,据说长语法更安全(或者我完全误解了它)。
    • 感谢它的工作,它终于工作我知道这是可能的,这太棒了
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2021-02-18
    • 2021-09-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2021-12-19
    相关资源
    最近更新 更多