如何使用 join on Objection.js 解析数据

How parse data using join on Objection.js

我有两个模型:地点和用户。 我只需要显示具有 status = true 和用户的 status 的地点列表,这是真实的,地点名称与用户输入的字符串相匹配。

class Place extends Model {

  static get tableName() {
    return 'place';
  }

  static get relationMappings() {
    return {
     user: {
        relation: Model.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'place.user_id',
          to: user.id',
        },
      },
    };

static get jsonSchema() {
    return {
      type: 'object',
      required: ['name'],

      properties: {
        id: { type: 'integer' },
        name: { type: 'string', minLength: 1, maxLength: 255 },
        user_id: { type: 'integer' },
        status: {type: boolean},
      },
    };
  }
  }

class User extends Model {
  static get tableName() {
    return 'user';
  }

  static get jsonSchema() {
    return {
      type: 'object',
      required: ['name'],

      properties: {
        id: { type: 'integer' },
        name: { type: 'string', minLength: 1, maxLength: 255 },
        status: {type: boolean},
      },
    };
  }
}

我正在尝试编写此查询:

Select palce.name user.name
from palce, user
where name like '%string%' and user.status is true and place.status is true

所以我尝试将 SQL 查询转换为 Objection.js 查询 运行 我的程序:

Place
.query()
.joinRelation('user')
.where(Place.raw('lower("name")'), 'like', '%string')
.andWhere('user.status', true)
.andWhere('place.status', true)
.then(result => {
console.log(results);
});

我试图用邮递员测试程序,但是我得到了这个错误:

{
    "name": "error",
    "length": 119,
    "severity": "ERROR",
    "code": "42703",
    "position": "146",
    "file": "parse_relation.c",
    "line": "3183",
    "routine": "errorMissingColumn"
}

当我尝试将地名变成小写时出现问题:

Place.raw('lower("name")')

那么,如何组合数据库来获取我需要的数据呢? 我用的是postgre这样的数据库。

您上面的代码确实有一些语法错误等,但在修复它们之后 (https://runkit.com/embed/5b5bu44kr79m) 似乎会产生以下 SQL 的异议,用于查询:

select "place".* 
  from "place" 
  inner join "user" as "user" 
    on "user"."id" = "place"."user_id" 
  where
    lower("name") like ? and 
    "user"."status" = ? and 
    "place"."status" = ?

也许您的列名称中有错字或类似的错误(因为错误来自数据库,它找不到具有特定名称的列)?

你必须像这样写 Place.raw('lower("name")') 不带引号 :

Place.raw('lower(name)')