Sails.js v0.12中Model.find()无法获取关联外键问题咨询
Sails.js v0.12 关联查询获取外键ID解决方案
嘿,我来帮你搞定这个关联查询的问题~ 你遇到的核心问题是Sails v0.12里model类型的关联默认不会自动返回外键字段,还有populateAll()的行为和你预期的不太一样,下面分两种场景给你具体解决办法:
一、查询User时直接获取关联Game的外键ID
方案1:直接查询自动生成的外键字段
Sails在处理model类型的关联时,会自动在数据库的User表中生成一个gameId字段(命名规则是关联名+Id),用来存储关联的Game的ID。你不需要用populate,直接查询这个字段就行:
User.find(7).exec(function(err, user) { if (err) return console.error(err); // user是数组,取第一个元素 console.log('用户关联的Game ID:', user[0].gameId); // 如果想返回包含email和gameId的完整对象 console.log('用户信息:', { email: user[0].email, gameId: user[0].gameId }); });
如果想明确指定返回的字段,也可以用select方法:
User.find(7).select(['email', 'gameId']).exec(function(err, user) { console.log(user[0]); // 输出: { email: 'someUserEmail', gameId: 123 } });
方案2:显式populate关联(如需Game的完整信息)
如果你不仅需要Game的ID,还想拿到Game的其他属性(比如name),就需要显式指定populate('game'),而不是用populateAll()——因为在Sails v0.12中,populateAll()默认只处理collection类型的关联,对model类型的关联不生效:
User.find(7).populate('game').exec(function(err, user) { if (err) return console.error(err); // 此时user[0].game是完整的Game对象 console.log('关联的Game ID:', user[0].game.id); console.log('关联的Game名称:', user[0].game.name); });
二、通过Game集合查询关联的用户
如果需要从Game出发查询关联的玩家,直接用populate('players')即可,因为players是Game模型里的collection类型关联:
1. 查询单个Game及其所有玩家
// 假设要查询ID为1的Game Game.findOne({ id: 1 }).populate('players').exec(function(err, game) { if (err) return console.error(err); console.log(`游戏${game.name}的玩家列表:`, game.players); });
2. 查询所有Game并关联各自的玩家
Game.find().populate('players').exec(function(err, games) { if (err) return console.error(err); games.forEach(game => { console.log(`游戏${game.name}有${game.players.length}名玩家`); }); });
3. 查询某用户所在的Game
如果你想通过用户ID反向查找他所在的Game,可以这么写:
// 假设用户ID是7 Game.findOne({ players: 7 }).exec(function(err, game) { if (err) return console.error(err); console.log(`用户7所在的游戏:`, game); });
小提醒
- 确保你的User表中确实存在
gameId字段,并且已经正确存储了关联的Game ID,不然查询肯定拿不到数据哦~ - Sails v0.12的关联中间表默认命名是
[模型名1]_[模型名2](比如Game和User的中间表是game_user),如果你自定义了关联的through属性,记得按自定义名称来处理。
内容的提问来源于stack exchange,提问作者aleph_one
相关产品推荐
相关产品推荐

