Size: a a a

TypeORM - Русскоязычное сообщество

2019 August 05

GB

Gleb Bigma in TypeORM - Русскоязычное сообщество
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
Странно создаешь
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
источник
2019 August 14

LK

L K in TypeORM - Русскоязычное сообщество
исправил пагинацию на skip & take, поменялся запрос, теперь сломался orderBy
еп колотить
let qb = this.jobRepository.createQueryBuilder('jobs');
       qb = jobsByManager(qb, managerId);
       qb = locationQuery(qb);
       qb = jobRecruitersQuery(qb);
       qb = jobClientQuery(qb);
       qb = jobNotDeletedQuery(qb);
       qb = paginateQuery(qb, params, PaginateType.APPLICATION);

       if (search) {
           managerJobsQuery = qb.andWhere(new Brackets(subQ => {
               subQ.where('jobs.title ILIKE :search', { search: `%${search}%` })
                   .orWhere('jobs.desc ILIKE :search', { search: `%${search}%` });
           }));
       }

       if (status) {
           qb = qb.andWhere('jobs.status = :status', { status });
       }

       if (orderBy) {
           qb = qb.orderBy(`${orderBy}`, ascDesc);
       }

       return await qb.getManyAndCount();

генерит такой запрос
SELECT DISTINCT "distinctAlias"."jobs_id" as "ids_jobs_id"
FROM (SELECT "jobs"."id" AS "jobs_id",
            "jobs"."points" AS "jobs_points",
            "jobs"."bounty" AS "jobs_bounty",
            "jobs"."start_at" AS "jobs_start_at",
            "jobs"."end_at" AS "jobs_end_at",
            "jobs"."updated_at" AS "jobs_updated_at",
            "jobs"."created_at" AS "jobs_created_at",
            "client"."created_at" AS "client_created_at",
            "client"."manager_id" AS "client_manager_id",
            "client"."metadata" AS "client_metadata"
     FROM "jobs" "jobs"
                 LEFT JOIN "countries" "country" ON "country"."id" = "jobs"."country_id"
                 LEFT JOIN "cities" "city" ON "city"."id" = "jobs"."city_id"
                 LEFT JOIN "clients" "client" ON "client"."id" = "jobs"."client_id"
     ) "distinctAlias"
ORDER BY "distinctAlias".jobs_start_at DESC, "jobs_id" ASC
LIMIT 25

QueryFailedError: column "start_at" does not exist


а если добавить alias в orderBy jobs.${orderBy} то будет такая ошибка TypeError: Cannot read property 'databaseName' of undefined

типа такого алиаса нету ибо typeorm делает subquery со своим алиасом
источник

LK

L K in TypeORM - Русскоязычное сообщество
как с этим жить, как бороться
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
L K
исправил пагинацию на skip & take, поменялся запрос, теперь сломался orderBy
еп колотить
let qb = this.jobRepository.createQueryBuilder('jobs');
       qb = jobsByManager(qb, managerId);
       qb = locationQuery(qb);
       qb = jobRecruitersQuery(qb);
       qb = jobClientQuery(qb);
       qb = jobNotDeletedQuery(qb);
       qb = paginateQuery(qb, params, PaginateType.APPLICATION);

       if (search) {
           managerJobsQuery = qb.andWhere(new Brackets(subQ => {
               subQ.where('jobs.title ILIKE :search', { search: `%${search}%` })
                   .orWhere('jobs.desc ILIKE :search', { search: `%${search}%` });
           }));
       }

       if (status) {
           qb = qb.andWhere('jobs.status = :status', { status });
       }

       if (orderBy) {
           qb = qb.orderBy(`${orderBy}`, ascDesc);
       }

       return await qb.getManyAndCount();

генерит такой запрос
SELECT DISTINCT "distinctAlias"."jobs_id" as "ids_jobs_id"
FROM (SELECT "jobs"."id" AS "jobs_id",
            "jobs"."points" AS "jobs_points",
            "jobs"."bounty" AS "jobs_bounty",
            "jobs"."start_at" AS "jobs_start_at",
            "jobs"."end_at" AS "jobs_end_at",
            "jobs"."updated_at" AS "jobs_updated_at",
            "jobs"."created_at" AS "jobs_created_at",
            "client"."created_at" AS "client_created_at",
            "client"."manager_id" AS "client_manager_id",
            "client"."metadata" AS "client_metadata"
     FROM "jobs" "jobs"
                 LEFT JOIN "countries" "country" ON "country"."id" = "jobs"."country_id"
                 LEFT JOIN "cities" "city" ON "city"."id" = "jobs"."city_id"
                 LEFT JOIN "clients" "client" ON "client"."id" = "jobs"."client_id"
     ) "distinctAlias"
ORDER BY "distinctAlias".jobs_start_at DESC, "jobs_id" ASC
LIMIT 25

QueryFailedError: column "start_at" does not exist


а если добавить alias в orderBy jobs.${orderBy} то будет такая ошибка TypeError: Cannot read property 'databaseName' of undefined

типа такого алиаса нету ибо typeorm делает subquery со своим алиасом
В манагер бд отрабатывает?
источник

LK

L K in TypeORM - Русскоязычное сообщество
ILshat Khamitov
В манагер бд отрабатывает?
прости, не понял ?
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
Запрос в базу когда кидаешь отрабатывает?
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
Через пг админ или что там у тя
источник

LK

L K in TypeORM - Русскоязычное сообщество
ILshat Khamitov
Запрос в базу когда кидаешь отрабатывает?
та ничего не работает
в одном случае и до запроса не доходит, а во втором запрос неправильный строит
источник

K

Kolpakov in TypeORM - Русскоязычное сообщество
L K
как с этим жить, как бороться
источник

K

Kolpakov in TypeORM - Русскоязычное сообщество
я писал Умеду об этой проблеме. фиксится она вот так, как на скрине
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
L K
та ничего не работает
в одном случае и до запроса не доходит, а во втором запрос неправильный строит
Не сильно вчитываался, трудно без кода
Вот у меня и с саб квери и сортировкой по этому полю
https://github.com/rucken/todo-nestjs/blob/master/libs/rucken/todo-nestjs/src/services/projects.service.ts#L171
источник

IK

ILshat Khamitov in TypeORM - Русскоязычное сообщество
И пагинацией
источник

K

Kolpakov in TypeORM - Русскоязычное сообщество
тут нужен leftJoinAndMapMany
источник
2019 August 15

LK

L K in TypeORM - Русскоязычное сообщество
ILshat Khamitov
Не сильно вчитываался, трудно без кода
Вот у меня и с саб квери и сортировкой по этому полю
https://github.com/rucken/todo-nestjs/blob/master/libs/rucken/todo-nestjs/src/services/projects.service.ts#L171
const { order = 'ASC', orderBy = 'client_type', page, perPage } = params;
       const skip = (perPage * page) - perPage;

       let qb = this.jobRepository.createQueryBuilder('jobs');
       qb = qb.leftJoinAndSelect(`jobs.client`, 'client');
       qb = qb
           .skip(skip)
           .take(perPage);

       if (orderBy) {
           const ascDesc = (order || 'DESC').toUpperCase() as OrderValues;
           qb = qb.orderBy(orderBy, ascDesc);
       }

       return await qb.getManyAndCount();

этого кода хватает для генерации неправильного запроса
SELECT DISTINCT "distinctAlias"."jobs_id" as "ids_jobs_id"
FROM (SELECT "jobs"."id"                         AS "jobs_id",
            "jobs"."title"                      AS "jobs_title",
            "client"."id"                       AS "client_id",
            "client"."company_name"             AS "client_company_name"
         
     FROM "jobs" "jobs"
            LEFT JOIN "clients" "client" ON "client"."id" = "jobs"."client_id") "distinctAlias"
ORDER BY client_type ASC, "jobs_id" ASC
LIMIT 25

error: error: column "client_type" does not exist
источник

LK

L K in TypeORM - Русскоязычное сообщество
т.е. вроде бы order by должен быть внутри subquery from
источник

LK

L K in TypeORM - Русскоязычное сообщество
фиксю я order by
ORDER BY "distinctAlias".jobs_client_type ASC, "jobs_id" ASC

говорит следующее ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

добавляю в select поле то что в order by юзается
SELECT DISTINCT "distinctAlias"."jobs_id" as "ids_jobs_id", "distinctAlias".jobs_client_type
источник

LK

L K in TypeORM - Русскоязычное сообщество
только так работает
источник

K

Kolpakov in TypeORM - Русскоязычное сообщество
проверил сейчас. занятный работающий костыль
источник