【问题标题】:How to fetch single row using withGraphJoined?如何使用 withGraphJoined 获取单行?
【发布时间】:2022-01-21 15:45:52
【问题描述】:

有两个表用户和活动。

我可以使用withGraphJoined 加入这些活动。响应json是这样的,

[
  {
    user: 'first',
    activity: [{ type: 'act1' }, { type: 'act2' }],
  },

  {
    user: 'second',
    activity: [{ type: 'act3' }, { type: 'act2' }],
  },
];

现在我只想获取第一个活动并将当前数组变成第一个活动对象。 {user:"second", activity:{type:"act3}}

我试过了,但我仍然得到了数组中的所有活动。

User.query()
  .withGraphJoined('activity')
  .modifyGraph('activity', (builder) => builder.first());

【问题讨论】:

    标签: javascript mysql node.js knex.js objection.js


    【解决方案1】:

    这取决于您如何定义关系 如果您希望它返回单个对象,则该关系应使用 Model.HasOneRelationModel.BelongsToOneRelation

    但是,如果您只想从多个活动中返回单个活动,则可以限制结果

    .modifyGraph('activity', (builder) => builder.orderBy('created_at', 'desc').limit(1));
    

    但它仍然会返回一个数组,其中包含一个您可以通过activity[0] 访问的项目 我能想到的唯一方法是,如果您手动将第一项映射到您的then 喜欢

    .then(user => {
        user.activity = user.activity[0] ? user.activity[0] : {}
        res.json(user)
    })
    

    为了保险起见,可以先检查item是否存在,避免出现null错误

    【讨论】:

    • 我能够通过转换为 Model.HasOneRelation 来解决我的问题。但是,我也尝试了另一种方法 .modifyGraph('activity', (builder) => builder.orderBy('created_at', 'desc').limit(1)); .它给出了数组中正确的一项,但仅适用于最后一项活动数组。所有其他活动数组都是空的。当我做“asc”时,它只为最重要的项目提供正确的活动,其他人是空的?这是应该发生的事情吗?
    • 是的,.limit(1) 只返回一个项目,订单只是为了获得latest 的值,您可以根据需要查询单个项目,例如,如果您有很多地址并且只想要.where('active',true)
    • 啊,我明白你所说的“所有其他活动数组都是空的”是什么意思,这不是我认为这会起作用的方式,如果你需要,你仍然可以使用手动映射技巧而不使用 .limit(1)定义 HasMany 或 ManyToMany
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2023-01-15
    相关资源
    最近更新 更多