Sequelize 原始查询返回重复数据

Sequelize raw query is returning duplicate data

所以,我得到一个查询,returns 一些用户的报告,代码是:

const reports = await database.query(
  'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \
  FROM reports r \
  left join users u1 on u1.id = r.reportedId \
  inner join users u2 on u2.id = r.madeById '
);

return reports;

如果我直接 运行 它在我的数据库中,它 returns 这个示例数据:

+----+------+------------------------------------------------+----------+------------+--------------+--------+
| id | type | fileCid | madeById | reportedId | reportedName | madeBy |
+----+------+------------------------------------------------+----------+------------+--------------+--------+
|  5 |    1 | cidF    |        4 |       NULL | NULL         | username    |
|  6 |    0 | cidF    |        4 |       NULL | NULL         | username    |
+----+------+------------------------------------------------+----------+------------+--------------+--------+

所以我作为对象的预期结果是:

[{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }]

但它确实返回了一组重复的数据:

[
    [{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }],
    [{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }]
]

为什么会这样?这显然是 sequelize 的问题,因为如果我 运行 它直接在 MySql 上 returns 只有 2 个寄存器,正如预期的那样......另外,不是重复的问题 ,虽然它似乎

编辑 这就是报告的 table 的定义方式。我只是猜测,因为我对同一个 table 使用了两个外键,也许 sequelize 导致了这个错误:

const Report = database.define('report', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true
  },
  type: {
      type: Sequelize.INTEGER,
      allowNull: false
  }
},
{
  updatedAt: false
}
)

Report.belongsTo(User, {as: 'madeBy'});
Report.belongsTo(User, {as: 'reported'});
Report.belongsTo(File);

query 函数可以接受选项作为第二个参数,这个 type 选项将决定响应的格式。

// The type of query you are executing. The query type affects how results are formatted before they are passed back.
type: QueryTypes.SELECT

原始查询的更多选项:https://sequelize.org/master/manual/raw-queries.html

您的查询是 SELECT,因此添加类型 SELECT 会将响应格式化为常规 Sequelize findAll.

const reports = await database.query(
    'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \
    FROM reports r \
    left join users u1 on u1.id = r.reportedId \
    inner join users u2 on u2.id = r.madeById ',
{ type: QueryTypes.SELECT }
);

此外,您也可以将此原始查询更改为 findAll,这是更符合 Sequelize 的方式。