gpt4 book ai didi

mysql - Sequelize - 从关联表中返回单个列作为自定义列

转载 作者:行者123 更新时间:2023-12-01 00:38:28 25 4
gpt4 key购买 nike

我有两个模型:用户和图片。用户有 profile_image_id 列。

当我使用 include {model:Images, as:'profileImage', attributes:['filename']} 获取用户时,我将 profileImage 作为对象 filename 作为属性。

Sequelize 中有没有办法将“文件名”作为用户模型的属性?执行的意思

SELECT u.id, u.name, i.filename 
FROM users u
LEFT JOIN images i ON i.id = u.profile_image_id
WHERE u.id = 1

目前有效的是定义用户的 VIRTUAL 属性 profileImageFIlename,然后将其填充到用户模型的 afterFind 函数中。但这似乎有很多额外的工作和不必要的数据。

除了原始查询还有更好的方法吗?

最佳答案

简短的回答是,没有一种方法可以“减少工作量”。即使在您的示例 SQL 查询中,您也使用为相关 images 表创建的别名来引用 i.filename。这有效地映射到 User.images.filename,它与 User.profile_image_file 一样有用。

如果您希望 profile_image_id 作为 UserVIRTUAL 字段存在,那么您的做法是正确的 - VIRTUAL 字段不会持久保存到数据库模式中,因此您需要从其他来源设置它们。在这种情况下,相关的 images 表提供了值,您需要在 afterfind() Hook 中设置它。

如果您不关心它在 User InstanceModel 上并且只想访问结果中的值而不必须遍历对象,您可以使用类似下面的东西通过利用 Sequelize.literal() 为列添加别名.

User.findById(1, {
attributes: {
include: [[Sequelize.literal('images.filename'), 'profile_image_file']],
},
include: [{ model: Images, as: 'images', attributes: [] }]
})
.then((user) => {
// There will be a user.dataValues.profile_image_file value populated
// but not a user.profile_image_file unless you set it in afterFind()
console.log(user.dataValues);
});

这将导致 SQL 的

SELECT `user`.`id`, `user`.`name`, images.filename AS `profile_image_file`
FROM `user` AS `user`
LEFT OUTER JOIN `images` AS `images` ON `user`.`profile_image_id` = `images`.`id`
WHERE `user`.`id` = 1;

关于mysql - Sequelize - 从关联表中返回单个列作为自定义列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41012263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com