【问题标题】:Translate a MySQL query into Knex QueryBuilder syntax equivalent?将 MySQL 查询转换为等效的 Knex QueryBuilder 语法?
【发布时间】:2016-07-06 19:23:14
【问题描述】:

我很难将特定的 MySQL 查询复制到 Knex(我使用 Bookshelf 作为 ORM)。直接在 MySQL 终端查询数据库时,SQL 查询本身返回正确的数据集。

MySQL 查询:

SELECT processed_articles.*, publications.pub_name
FROM processed_articles
INNER JOIN processed_articles_trends ON processed_articles_trends.processed_article_id = processed_articles.id
INNER JOIN publications ON publications.id = processed_articles.pub_id
WHERE (processed_articles_trends.trend_id = 2);

Knex 查询构建器:

knex.select(['publications.pub_name', 'processed_articles.*'])
  .innerJoin('processed_articles_trends', 'processed_articles.id', 'processed_articles_trends.processed_article_id')
  .innerJoin('publications', 'processed_articles.pub_id', 'publications.id')
  .where('processed_articles_trends.trend_id', '=', 2);

我知道 Knex 语法不正确,但我不确定在哪里(我怀疑 Knex 查询的第 1 行中的数组语法......)& 无法为我弄清楚如何翻译 SQL .表 'processed_articles_trends' 表示表 'processed_articles' 和 'trends' 表之间的连接表。

我最初尝试使用我的 Bookshelf 模型定义和“withRelated”参数,但 Bookshelf 在幕后执行了一些巫术,这让我很难确定如何从“出版物”中撤回我需要的字段'表。

感谢任何见解 - 非常感谢。

【问题讨论】:

    标签: javascript mysql bookshelf.js knex.js


    【解决方案1】:
    knex('processed_articles')
      .innerJoin('processed_articles_trends', 'processed_articles.id', 'processed_articles_trends.processed_article_id')
      .innerJoin('publications', 'processed_articles.pub_id', 'publications.id')
      .where('processed_articles_trends.trend_id', '=', 2)
      .select(db.raw('processed_articles.*'))
      .select('publications.pub_name')
    

    【讨论】:

    • 谢谢施瑞拉姆。出于兴趣,我的方法的主要缺陷是什么? db.raw() 方法在做什么,这些语句的顺序如何影响结果?非常感谢!
    • db.raw() 通常用于对无法使用 knex 构建的查询进行硬编码。我不确定排序如何影响结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多