Sequelize - поисковый запрос с критериями для вложенной сущности - PullRequest
0 голосов
/ 10 сентября 2018

Я использую 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.

1 Ответ

0 голосов
/ 11 сентября 2018

Вот, пожалуйста:

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 с вашим именем таблицы

Когда вы выполняете запрос внутри включаемой модели, он выполняет внутреннее соединение с включенная таблица, чтобы сделать ее левой, вы можете использовать required:false, но это не тот случай, что вам нужно здесь

Вместо использования длинного синтаксиса Server.sequelize.Op.iLike вы можете использовать короткие операторы $iLike, подробнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...