Как перевести MySQL запрос, чтобы секвестировать orm - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно выполнить этот множественный запрос LEFT JOIN с помощью sequelize:

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 но я ожидаю, что он будет использовать ON с genres_link

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

Полагаю, я не совсем понимаю ассоциации таблиц и напутал с hasMany, или я пропускаю другое утверждение

таблицы выглядят как

yt_movies

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

genres_link

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

жанры

| id | genre    |
|----|----------|
| 12 | action   | 
| 13 | thriller | 
| 14 | horror   | 

все, что я сделал, - это выполнил первый ЛЕВЫЙ СОЕДИНЕНИЕ ... добавление второго включения не помогло, и я боюсь, что по-настоящему не понимаю ассоциаций таблиц даже после прочтения документов: |

Полагаю, мне нужно использовать принадлежащий ToMany, но сейчас я не понимаю, как:))

Я ценю всю помощь! Спасибо и HALP!

1 Ответ

0 голосов
/ 26 марта 2019

Чтобы присоединиться к 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 
          }
          ]
       });

Руководство содержит полезную информацию по этой теме ...

...