Заказ микро-ордеров ST_Distance_Sphere с использованием драйвера MySQL - PullRequest
1 голос
/ 06 апреля 2020

При MySQL я пытаюсь заказать по ST_Distance_Sphere, используя QueryBuilder.

У меня есть объект:

import { Entity, PrimaryKey, Property } from "mikro-orm";

@Entity({ tableName: "studio" })
export default class StudioEntity {
    @PrimaryKey()
    public id!: number;

    @Property()
    public name!: string;

    @Property({ columnType: "point srid 4326" })
    public geometry!: object;
}

И я пытаюсь:

export default class StudioStore {
    private studioRepository: EntityRepository<StudioEntity>;

    public constructor(ormClient: OrmClient) {
        this.studioRepository = ormClient.em.getRepository(StudioEntity);
    }

    public async findPage(first: number): Promise<StudioEntity[]> {
        const query = this.studioRepository.createQueryBuilder().select("*");

        query.addSelect(
            "ST_Distance_Sphere(`e0`.`geometry`, ST_GeomFromText('POINT(28.612849 77.229883)', 4326)) as distance",
        );

        query.orderBy({ distance: "ASC" });

        return query.limit(first).getResult();
    }
}

Но я получаю ошибку ORM:

Попытка запроса по несуществующему свойству StudioEntity.distance

Итак, я пытаюсь добавить свойство в объект:

    @Property({ persist: false })
    public distance?: number;

Но теперь я получаю MySQL ошибку:

Неизвестный столбец 'e0.distance' в 'предложении заказа'

Это сгенерированный SQL запрос:

[query] select `e0`.*, ST_Distance_Sphere(`e0`.`geometry`, ST_GeomFromText('POINT(28.612849 77.229883)', 4326)) as distance from `studio` as `e0` order by `e0`.`distance` asc limit 5 [took 4 ms]

1 Ответ

1 голос
/ 06 апреля 2020

Вам нужно будет вернуться к knex, так как QB в настоящее время поддерживает только определенные поля свойств в порядке по. Вам также нужно будет определить это виртуальное свойство distance, как вы уже это сделали, чтобы значение можно было сопоставить с сущностью.

https://mikro-orm.io/docs/query-builder/#using -knex js

const query = this.studioRepository.createQueryBuilder().select("*");
query.addSelect("ST_Distance_Sphere(`e0`.`geometry`, ST_GeomFromText('POINT(28.612849 77.229883)', 4326)) as distance");
query.limit(first);
const knex = query.getKnexQuery();
knex.orderBy('distance', 'asc');
const res = await this.em.getConnection().execute(knex);
const entities = res.map(a => this.em.map(StudioEntity, a));

Не очень приятно, должен сказать, совершенно забыл, что можно делать заказы по вычисленным полям , Постараюсь решить эту проблему в v4. Я думаю, что он может даже работать как ваш второй подход, так как QB может просто проверить, является ли свойство виртуальным (имеет persist: false), и тогда оно не префиксирует его.

edit: с 3.6.6 подход с persist: false должен работать из коробки

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