动态向sequelize.js查询添加属性

时间:2018-06-29 17:12:38

标签: javascript node.js sequelize.js

我有一个查询,其中包含多个看起来像这样的属性。

const queryPvCompletedByMonth = {
    attributes: [
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(0).startDate}' AND '${
            getFirstAndLastDayInMonth(0).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Jan',
      ],
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(1).startDate}' AND '${
            getFirstAndLastDayInMonth(1).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Feb',
      ],
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(2).startDate}' AND '${
            getFirstAndLastDayInMonth(2).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Mar',
      ],
    ],
    where: {
      Field2: 2,
    },
    raw: false,
  };

以此类推。这行得通,我从查询中得到了预期的结果。

由sequelize生成的查询如下所示。

  

SELECT COUNT(在“ 2018-01-01”和“ 2018-01-31”之间,然后在1ELSE NULL END之间转换的情况(日期,[Field1])的情况)为[Jan],   COUNT(在“ 2018-02-01”和“ 2018-02-28”之间然后“ 1 ELSE NULL END”之间转换(日期,[Field1])的情况下)为[Feb],   COUNT(“ CONVERT(日期,[Field1])在'2018-03-01'和'2018-03-31'然后1否则为NULL结束之间转换的情况)为[3月]   FROM [dbo]。[Table1] AS [table1] WHERE [table1]。[field2] = 2;

我不想动态地插入12个硬编码的属性。所以我把所有的几个月都放在这样的数组中。

const months = [
  { index: 0, name: 'Jan' },
  { index: 1, name: 'Feb' },
  { index: 2, name: 'Mar' },
  { index: 3, name: 'Apr' },
  { index: 4, name: 'May' },
  { index: 5, name: 'Jun' },
  { index: 6, name: 'Jul' },
  { index: 7, name: 'Aug' },
  { index: 8, name: 'Sep' },
  { index: 9, name: 'Oct' },
  { index: 10, name: 'Nov' },
  { index: 11, name: 'Dec' },
];

并尝试通过列表进行映射以返回此类属性。

const queryPvCompletedByMonth = {
    attributes: [
      months.map(m => [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${
            getFirstAndLastDayInMonth(m.index).startDate
          }' AND '${getFirstAndLastDayInMonth(m.index).endDate}' THEN 1 ELSE NULL END)`
        ),
        m.name,
      ]),
    ],
    where: {
      AOTyp: 2,
    },
    raw: false,
  };

这给我一个序列错误

  

[[{{\“ val \”:\“ COUNT(转换为“ 2018-01-01”和“ 2018-01-31”之后为1,否则为空结束)的情况(当转换为(日期,[Field1])时) },\“ Jan \”],[{\“ val \”:\“ COUNT(在CONVERT(date,[Field1])转换为“ 2018-02-01”和“ 2018-02-28”之间的情况,然后为1 NULL END)\“},\” Feb \“],[{\” val \“:\” COUNT(在转换时的情况(日期,[Field1])在'2018-03-01'和'2018-03-之间31'THEN 1 ELSE NULL END)\“},\” Mar \“]]不是有效的属性定义。请使用以下格式:['属性定义','别名']

因此,它可以创建正确的查询,但是带有很多轴符号。

所以我的问题是,有没有办法实现这一目标?

1 个答案:

答案 0 :(得分:0)

我通过在查询外部将属性声明为空数组然后将每个属性推入其中来使它起作用。

const attributesPvCompletedByMonth = [];

地图功能:

const generateAttributesForPvCompletedMyMonths = () => {
  months.map(m => {
    const attribute = [
      Sequelize.literal(
        `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${
          getFirstAndLastDayInMonth(m.index).startDate
        }' AND '${getFirstAndLastDayInMonth(m.index).endDate}' THEN 1 ELSE NULL END)`
      ),
      m.name,
    ];
    return attributesPvCompletedByMonth.push(attribute);
  });
};

查询

const queryPvCompletedByMonth = {
  attributes: attributesPvCompletedByMonth,
  where: {
    Field2: 2,
  },
  raw: true,
};