Javascript 在Objective.js中,如何在查询中包含虚拟列?

Javascript 在Objective.js中,如何在查询中包含虚拟列?,javascript,knex.js,objection.js,Javascript,Knex.js,Objection.js,我想创建一个expired\u bool虚拟列 我有以下三个表格: 订阅: 身份证件 期间 价格 1. 30 0.99 2. 360 1.99 一种可能的解决方案是将到期日列添加到发票项目 订阅激活期间将同时设置激活日期和到期日期 activation_date = today's date expiry_date = activation_date + subscription duration 发票项目: 身份证件 用户id 发票号 订阅id 激活日期 有效期 1. 34 1. 1. 20

我想创建一个
expired\u bool
虚拟列

我有以下三个表格:

订阅

身份证件 期间 价格 1. 30 0.99 2. 360 1.99
一种可能的解决方案是将
到期日
列添加到
发票项目

订阅激活期间将同时设置
激活日期
到期日期

activation_date = today's date
expiry_date = activation_date + subscription duration
发票项目

身份证件 用户id 发票号 订阅id 激活日期 有效期 1. 34 1. 1. 2020-05-15 12:51:51 2020-06-14 12:51:51 2. 34 1. 2. 2021-02-20 20:20:12 2022-02-15 20:20:12 3. 42 2. 1. 无效的 无效的 4. 42 2. 2. 2021-02-20 20:20:12 2022-02-15 20:20:12
显然,您不能使用虚拟字段来执行异步操作。也不能基于虚拟字段进行查询。它们完全是用javascript定义的

因此,可以按如下方式执行(使用从Objective.js导入的
raw
):

从“异议”导入异议;
const{Model,raw}=objective;
...
类InvoiceItem扩展了模型{
...
静态修改器={
过期信息(qb){
选择(
“发票项目”。”,
原始('activation\u date+make\u interval(days=>subscription.duration'))。as('expiration\u date'),
原始('activation_date+make_interval(days=>subscription.duration)
这使用了Postgres函数,但是对于其他数据库的想法是一样的,尽管
raw
中的代码可能需要稍微调整

import objection from "objection";
const { Model, raw } = objection;
...

class InvoiceItem extends Model {
  ...
  static modifiers = {
    expiryInfo(qb) {
      qb.select(
        'invoice_items.*', 
        raw('activation_date + make_interval(days => subscription.duration)').as('expiration_date'),
        raw('activation_date + make_interval(days => subscription.duration) < now()').as('expired_bool'),
      ).joinRelated('subscription')
    }
  }
  ...
}

    const query = await User.query()
      .findById(userId)
      .withGraphFetched("invoiceItems(expiryInfo).subscription")
      .withGraphFetched("invoices")