当我在 adonis.js/node 中收到查询参数时,如何有条件地添加 where's?

How i can add where's conditionally when i receive query params in adonis.js/node?

实际上我有这个查询 returns 数据库中的所有用户:

async index({request}) {
    const page = request.input('page')
    const pageSize = request.input('pageSize')
    const users = await User
        .query()
        .with('user')
        .paginate(page, pageSize)
    return users.toJSON()
}

如果我收到参数,我需要有条件地创建一种方法来放置此查询中的位置。

例如,如果我收到 request.input('username') 附加一个,其中:

.whereRaw('username = %?%', [request.input('username')])

我在文档中没有找到解释我如何有条件地创建 where's 的内容。有人可以解释一下吗?

尝试过:

async index({request}) {
    const page = request.input('page')
    const pageSize = request.input('pageSize')
    const queryUsers = await User
        .query()
        .with('user')
        .paginate(page, pageSize)

    if(request.input('username'))
        queryUsers.where('username = %?%', [request.input('username')])

    return queryUsers.toJSON()
}

但我收到:

queryUsers.where is not a function

实际上,如果您查看文档的这一部分 Query Builder,您会发现您的查询不是 运行,直到您 运行 .fetch() 或您的情况.paginate()。您的代码将是这样的:

async index({request}) {
    const { page, pageSize } = request.get();
    const queryUsers = User
        .query()
        .with('user')

    if(request.input('username'))
        queryUsers.where('username', '=', request.input('username'))

    const users = await queryUsers.paginate(page, pageSize)

    return users
}

我在@VladNeacsu 的帮助下修复了问题,我的最终代码是这样的:

async index({request}) {
    const { page, pageSize } = request.get();
    const queryUsers = User
        .query()
        .with('user')

    if(request.input('username'))
        queryUsers.where('username', '=', request.input('username'))

    const users = await queryUsers.paginate(page, pageSize)

    return users
}

您可以使用 if 助手来编写更简洁的版本,documented here

async index({request}) {
    const { page, pageSize } = request.get();
    const username = request.input('username')

    const users = await User
        .query()
        .with('user')
        .if(!!username, (query) => {
           query.where('username', '=', username)
        })
        .paginate(page, pageSize)

    return users
}