javascript - 如何将mysql查询翻译为sequelize orm
问题描述
我需要使用 sequelize 执行这个多重 LEFT JOIN 查询:
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 withyt_movies
但我希望它使用 ON withgenres_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 |... | | |
流派_链接
| 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 |
我所做的只是设法执行第一个 LEFT JOIN ... 添加第二个包含没有帮助,而且恐怕即使在阅读文档之后我也不会真正理解表关联:|
我想我需要使用belongsToMany,但目前我不明白如何:))
我感谢所有的帮助!谢谢和暂停!
解决方案
要加入 A->B->C,您应该将 C 的包含嵌套在 B 的包含中,例如
A.findAll({
include: [
{
model: B,
include: [
{model: C}
]
}
]
})
但是,如果表genres_link 除了电影和流派的PK 之外没有其他属性,则使用through。
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
}
]
});
该手册有一些关于这个主题的有用信息......
推荐阅读
- c++ - 在这个简单的例子中,为什么 std::optional 的赋值运算符不能在编译时上下文中使用?
- apache - 查找 +php-osx.conf 时遇到问题
- r - 如何在 tmaps 标签中添加与值组合的标签
- python - Flask 和 SQLAlchemy - 错误绑定参数
- jdbc - Kafka Connect:使用 JDBC Sink Connector 展平 ARRAY 记录
- javascript - 带有 XMLHttpRequest() 的 formData POST 请求不起作用,但在邮递员中工作
- python - 列表索引超出范围python OpenCV?
- macos - 如何将图标添加到 Launchpad 以用于位于我的捆绑包资源文件夹 (macOS Big Sur) 中的辅助应用程序?
- sql-server - EF Core 如何在 EF Core 中实现一次读取操作的脏读?
- google-cloud-platform - 如何以编程方式从 GCP 市场创建 WURFL 服务?