【问题标题】:MikroORM Create filter query based on a value in the databaseMikroORM 根据数据库中的值创建过滤器查询
【发布时间】:2022-01-18 07:25:46
【问题描述】:

简单地说,是否可以在我引用存储在行中的值的位置创建过滤查询?

例如:

orm.em.findOne(Job, {
   status: 'active',
   startDate: {
     $gt: '$anotherDateField'
   }
}

我的目标是有一个用户输入定义的过滤器(状态),但也只带回开始日期大于另一列值的某些行。

【问题讨论】:

    标签: mikro-orm


    【解决方案1】:

    您可以使用自定义 SQL 片段

    orm.em.findOne(Job, {
       status: 'active',
       // expr helper allows to escape strict typing of the method, so we can use `em.raw()`
       [expr('startDate')]: {
         $gt: orm.em.raw('another_date_field') // this will have to be column name, not property name
       }
    }
    

    请注意,您的em 需要输入到从驱动程序包导出的那个才能访问em.raw() 方法(如果您使用orm 实例,您需要将其输入到MikroORM<YourDriver> 所以@ 987654327@可以正确输入)。

    https://mikro-orm.io/docs/entity-manager/#using-custom-sql-fragments

    【讨论】:

    • 感谢您如此快速的回复。我正在使用辅助函数来生成过滤器查询,因此无法访问底层em,因为它处理复杂的 json 字段查询。如果不参考em,这可能吗?如果没有,我将其作为参数传入。
    • 您可以尝试将其包装在括号中,以便 ORM 将其视为自定义表达式,例如$gt: '(another_date_field)'。不知道行不行,没试过
    • 我似乎很难让 em 访问 raw。我正在注入:orm: MikroORM<PostgreSqlDriver>,但orm.em 上不存在raw(mikro-orm 4.5.9,mikro-orm psql 4.5.9)。
    • 我通过在 EntityManager 上使用 getKnex 解决了这个问题。这现在似乎正在生成正确的 SQL,即使使用 JSON 字段也是如此。非常感谢。
    • 我明白了,em.raw() 只是 v5,但它只是一个快捷方式
    猜你喜欢
    • 2020-07-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2017-10-30
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多