Проблема при преобразовании SQL-запроса с ЛЮБОМ оператором в функцию Sequelize findAll - PullRequest
0 голосов
/ 14 мая 2019

У меня есть три таблицы:
1. сообщения (postId (PK), postTitle, postDescription)
2. кампании (идентификатор кампании (PK), идентификатор платформы (FK), эффективные от, эффективные, через Array: postId [])
// Здесь postArray содержит postIds типа Integer
3. платформы (platformId (PK), platformName)

и мой запрос на PostgreSQL Client:

select posts.*, platforms.*, campaigns.campaignId, campaigns.platformId, campaigns.postArray
from campaigns
INNER JOIN platforms
ON campaigns.platformId = platforms.platformId
INNER JOIN posts
ON posts.postId = ANY(campaigns.postArray);

, который возвращает следующий вывод:

postid  posttitle   postdescription platformid  platformname    campaignid  platformid  postarray
1       Post1       This is Post1       1       Facebook        1           1          {1,2,3}
2       Post2       This is Post2       1       Facebook        1           1          {1,2,3}
3       Post3       This is Post3       1       Facebook        1           1          {1,2,3}
2       Post2       This is Post2       1       Facebook        2           1          {2,4,5}
4       Post4       This is Post4       1       Facebook        2           1          {2,4,5}
5       Post5       This is Post5       1       Facebook        2           1          {2,4,5}
2       Post2       This is Post2       3       LinkedIn        3           3          {2,3,4,5}
...

Теперь я хочу получить такой же вывод в Sequelize и не уверен, как использовать оператор «Any» в функции findAll.

Это моя находкаВсе коды:

exports.findAll = (req, res, next) => {
    Campaigns.findAll({
        include: [
            {
                model: Platform,
                required: true
            },
            {
                model: Post,
                required: true,
                [Op.any]: ['"postArray"']
            }
        ],
        order:[
            ['"campaignId"', 'ASC']
        ]
    })
    .then(campaign=> {
        res.status(200).json(campaign.sort(function(c1, c2){return c1.campaignId - c2.campaignId}));
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({msg: "error", details: err});
    });
};

и вот отношения:

  db.campaigns.hasMany(db.posts,{sourceKey: 'postId', foreignKey: 'postArray'});
  db.campaigns.hasOne(db.platforms,{sourceKey: 'platformId', foreignKey: 'platformId'});

Я знаю, что делаю это неправильно, и это не сработает. Пожалуйста, предложите мне решение и лучший подход к моей проблеме.

1 Ответ

0 голосов
/ 05 июля 2019

Sequelize не поддерживает отношения через массивы. Создание JOIN с использованием include поддерживает только отношения, определенные в sequelize, и поскольку невозможно определить отношение в sequelize, это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...