在没有两个查询的情况下如何在Knex中执行此操作

塞尔吉奥·阿维拉(Sergio Avilla)

我想不使用两个查询来执行此搜索:

app.db('users').where({
            id: req.userData.id
        }).first().then(result => {

            if (!result) {
                throw new CompleteError('Usuário não encontrado.', 404)
            }

            app.db('addresses').where({
                id: result.address_id
            }).first().then(address_result => {
                if (address_result) {
                    result.address = address_result
                    res.json(result)
                } else {
                    throw new CompleteError('Falha ao buscar endereço do usuário.', 500)
                }
            }).catch(e => {
                return next(e)
            })

        }).catch(e => {
            return next(e)
        }) 

如果其中一项搜索失败或找不到任何寄存器,则搜索进度将停止并抛出错误。该数据库是postgresql。如果没有这种方法的替代方法,请帮助改善代码,我是入门开发人员,我需要您的意见。拜托,对不起我的英语。

结果必须是这样的:

{
  "id": 21,
  "name": "Sérgio",
  "cpf": "11111111111",
  "email": "[email protected]",
  "pass": "$2a$10$Jx7wAd3QSMFlkXi3g0eVOOoW8o65OgDZVQ7wTWuxquytVhUhrUf/.",
  "phone": "5544313113131",
  "last_access": "2020-08-11T10:14:20.207Z",
  "created_at": "2020-08-11T10:14:20.207Z",
  "deleted_at": null,
  "address_id": 21,
  "address": {
    "id": 21,
    "street": "Street Manu",
    "number": "851",
    "complement": "A",
    "city": "Mari Hill",
    "state": "Para",
    "country": "Brazil",
    "last_access": "2020-08-11T10:14:19.837Z",
    "created_at": "2020-08-11T10:14:19.837Z",
    "deleted_at": null
  }
}
克里滕

您可以使用JOIN执行此查询,然后重新排列结果。

您要查找的查询如下所示:

SELECT *
FROM users
    LEFT JOIN addresses ON addresses.id=users.address_id;

(我对MySQL / MariaDB较为熟悉,因此语法可能有所不同)。

LEFT JOIN意味着,如果找到用户但未找到地址,则地址列将为null。

可以将其转换为以下Knex表达式:

app.db('users')
    .leftJoin('addresses', 'addresses.id', '=', 'users.address_id')
    .select(
        'users.id',
        'users.name',
        'users.cpf',
        'users.email',
        'users.pass',
        'users.phone',
        'users.last_access',
        'users.created_at',
        'users.deleted_at',
        'users.address_id',
        'addresses.id AS addr_id',
        'addresses.street AS addr_street',
        'addresses.number AS addr_number',
        'addresses.complement AS addr_complement',
        'addresses.city AS addr_city',
        'addresses.state AS addr_state',
        'addresses.country AS addr_country',
        'addresses.last_access AS addr_last_access',
        'addresses.created_at AS addr_created_at',
        'addresses.deleted_at AS addr_deleted_at'
    )
    .first()
    .then((result) => {
        // no result at all? no user found
        if (!result) {
            throw new CompleteError('Usuário não encontrado.', 404);
        }

        // no addr_id? user found but not the address
        if (!result.addr_id) {
            throw new CompleteError('Falha ao buscar endereço do usuário.', 500);
        }

        // result contains all the fields from BOTH tables as a flat object
        // you'll need to rearrange things
        return {
            // assign properties to new names...
            id: result.id,
            // and so on...
        };
    });

注意,我已经重命名addressesselect()呼叫中的所有列这是因为Knex不会在带有JOIN子句的查询中分配新的列名,除非您明确命名列,否则您将获得重复的列名(以及很多混乱)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在没有同步块(即低成本锁)的情况下,如何在一次安全操作中自动检查Java中的两个AtomicBooleans?

来自分类Dev

如何在Swift中在没有代码重复的情况下实现具有相同内容的两个init?

来自分类Dev

如何在没有此奇怪结果的情况下合并Google文本文档中表格的两个单元格?

来自分类Dev

如何在没有ffffeg的情况下合并两个文件

来自分类Dev

如何在没有for循环的情况下执行此操作

来自分类Dev

在SQL Server中添加两个列值以填充第三列,是否可以在没有触发器/存储过程的情况下完成此操作?

来自分类Dev

如何在没有服务器的情况下通过套接字连接两个Android设备

来自分类Dev

如何在没有for循环的情况下对两个矩阵的每一列进行快速矩阵乘法?

来自分类Dev

如何在没有for循环的情况下从两个断点创建长度为n的布尔掩码?

来自分类Dev

如何在没有sudo的情况下执行'iftop'

来自分类Dev

如何在没有整个分支的情况下仅对最后两个提交进行重新设置?

来自分类Dev

如何在不使用for循环的情况下向量化这两个numpy操作?

来自分类Dev

如何在没有嵌入式订阅的情况下执行一个异步操作

来自分类Dev

如何在没有任何条件的情况下链接两个选择?

来自分类Dev

在没有.then()的情况下执行两个函数

来自分类Dev

在不使用Either的情况下如何在Java中执行此操作?

来自分类Dev

如何在没有默认“排序”的情况下加入两个集合

来自分类Dev

如何在Shell脚本中没有“ awk”的情况下执行此操作

来自分类Dev

Java泛型,如何在没有instanceof或强制转换的情况下执行此操作?

来自分类Dev

如何在没有集合的情况下从列表中查询一个对象?

来自分类Dev

如何在没有一百万个AND / OR的情况下缩短此SQL查询?

来自分类Dev

如何在没有“ onSaveInstanceState之后无法执行此操作”的情况下打开另一个应用程序?

来自分类Dev

如何在没有for循环的情况下对矩阵的每一行执行操作?

来自分类Dev

如何在没有警告的情况下执行resolvconf?

来自分类Dev

Matlab:如何在没有暴力for循环的情况下执行行操作?

来自分类Dev

两个如何在没有任何索引的情况下合并两个数据帧

来自分类Dev

如何在没有 Bootstrap 的情况下使用纯 CSS 将两个 div 居中?

来自分类Dev

如何在R中没有排列的情况下执行DF的两列的交互?

来自分类Dev

Django 中的两个表单-如何在没有所有字段的情况下使表单可提交?

Related 相关文章

  1. 1

    在没有同步块(即低成本锁)的情况下,如何在一次安全操作中自动检查Java中的两个AtomicBooleans?

  2. 2

    如何在Swift中在没有代码重复的情况下实现具有相同内容的两个init?

  3. 3

    如何在没有此奇怪结果的情况下合并Google文本文档中表格的两个单元格?

  4. 4

    如何在没有ffffeg的情况下合并两个文件

  5. 5

    如何在没有for循环的情况下执行此操作

  6. 6

    在SQL Server中添加两个列值以填充第三列,是否可以在没有触发器/存储过程的情况下完成此操作?

  7. 7

    如何在没有服务器的情况下通过套接字连接两个Android设备

  8. 8

    如何在没有for循环的情况下对两个矩阵的每一列进行快速矩阵乘法?

  9. 9

    如何在没有for循环的情况下从两个断点创建长度为n的布尔掩码?

  10. 10

    如何在没有sudo的情况下执行'iftop'

  11. 11

    如何在没有整个分支的情况下仅对最后两个提交进行重新设置?

  12. 12

    如何在不使用for循环的情况下向量化这两个numpy操作?

  13. 13

    如何在没有嵌入式订阅的情况下执行一个异步操作

  14. 14

    如何在没有任何条件的情况下链接两个选择?

  15. 15

    在没有.then()的情况下执行两个函数

  16. 16

    在不使用Either的情况下如何在Java中执行此操作?

  17. 17

    如何在没有默认“排序”的情况下加入两个集合

  18. 18

    如何在Shell脚本中没有“ awk”的情况下执行此操作

  19. 19

    Java泛型,如何在没有instanceof或强制转换的情况下执行此操作?

  20. 20

    如何在没有集合的情况下从列表中查询一个对象?

  21. 21

    如何在没有一百万个AND / OR的情况下缩短此SQL查询?

  22. 22

    如何在没有“ onSaveInstanceState之后无法执行此操作”的情况下打开另一个应用程序?

  23. 23

    如何在没有for循环的情况下对矩阵的每一行执行操作?

  24. 24

    如何在没有警告的情况下执行resolvconf?

  25. 25

    Matlab:如何在没有暴力for循环的情况下执行行操作?

  26. 26

    两个如何在没有任何索引的情况下合并两个数据帧

  27. 27

    如何在没有 Bootstrap 的情况下使用纯 CSS 将两个 div 居中?

  28. 28

    如何在R中没有排列的情况下执行DF的两列的交互?

  29. 29

    Django 中的两个表单-如何在没有所有字段的情况下使表单可提交?

热门标签

归档