如何将mysql查询翻译为sormize orm

时间:2019-03-26 10:01:35

标签: javascript mysql left-join sequelize.js

我需要使用续集执行此多个LEFT JOIN查询:

[ { _index: 'worklight__appsession__1485302400000',
    _type: 'AppSession',
    ... Some Data,
{ _index: 'worklight__appsession__1485302400000',
    _type: 'AppSession',
    ... Some Data,
{ _index: 'worklight__appsession__1485302400000',
    _type: 'AppSession',
    ... Some Data,
]

我尝试过

SELECT movie, genre FROM `yt_movies` M 
LEFT JOIN `genres_link` GL ON M.id = GL.movie_id
LEFT JOIN `genres` G ON GL.genre_id = G.id
WHERE M.id = 1098

返回的查询看起来像

const YtMovies = db.yt_movies;
const Genres = db.genres;
const GenresLink = db.genres_link;

YtMovies.hasMany(GenresLink, { as: 'GL', foreignKey: 'movie_id' });
YtMovies.hasMany(Genres, { as: 'G', foreignKey: 'genre' });

const res = await db.yt_movies.findAll({
                    attributes: ['movie'],
                    where: { id: movie_id },
                    include: [
                        {
                            model: db.genres_link,
                            as: 'GL',
                            required: false,
                            attributes: ['genre_id'],
                        },
                        {
                            model: db.genres,
                            required: false,
                            as: 'G',
                            attributes: ['genre'],
                        },
                    ],
                });

在最后两个字符串中,我们可以看到它对SELECT `yt_movies`.`id`, `yt_movies`.`movie`, `GL`.`id` AS `GL.id`, `GL`.`genre_id` AS `GL.genre_id`, `G`.`id` AS `G.id`, `G`.`genre` AS `G.genre` FROM `yt_movies` AS `yt_movies` LEFT OUTER JOIN `genres_link` AS `GL` ON `yt_movies`.`id` = `GL`.`movie_id` LEFT OUTER JOIN `genres` AS `G` ON `yt_movies`.`id` = `G`.`genre` WHERE `yt_movies`.`id` = 1098; 使用ON 但我希望它与yt_movies

一起使用
genres_link

我想我不太了解表关联,并且弄乱了hasMany,或者我想念另一条语句

表看起来像

yt_movies

LEFT JOIN `genres` AS G ON GL.genre_id = G.id <-- expected

流派链接

| id | movie   | pj | pq|
|----|---------|----|---|
|  1 |Avatar   |    |   |
|  2 |Predator |    |   |
|  3 |...      |    |   | 

类型

| id | genre_id| movie_id |
|----|---------|----------|
|  1 |  12     |    1     | // avatar
|  2 |  13     |    2     | // predator
|  3 |  14     |    2     | // predator

我所做的一切都设法执行了LEFT JOIN ...添加第二个include并没有帮助,而且即使阅读了文档后,恐怕我也不会真正理解表关联:|

我想我需要使用belongsToMany,但是此刻我不明白如何:))

感谢所有帮助! 谢谢,谢谢!

1 个答案:

答案 0 :(得分:0)

要加入A-> B-> C,您应将C的包含内容嵌套在B的包含内容中,例如

A.findAll({    
    include: [
       {
         model: B,
         include: [
             {model: C}
             ]
         }
     ]
     })

但是,如果表genres_link除了电影和流派的PK之外没有其他属性,则使用

   YtMovies.belongsToMany(Genres, {through: GenresLink, foreignKey: 'movie_id' });
   Genres.belongsToMany (YtMovies,{through: GenresLink, foreignKey: 'genre_id '});

    YtMovies.findAll({    
       include: [
          {
           model: Genres, 
           required : true,
           through: GenresLink 
          }
          ]
       });

manual提供了有关此主题的一些有用信息...