waz*_*day 11 postgresql node.js sequelize.js
我有一张桌子供人们自我联合,所以人们可以有父母/孩子/表兄弟等.
const People = sequelize.define('People', {
gender: Sequelize.STRING,
name: Sequelize.STRING,
age: Sequelize.INTEGER
})
const Relationships = sequelize.define('Relationships')
Items.belongsToMany(Items, { through: Relationships, as: 'relationships' })
Run Code Online (Sandbox Code Playgroud)
我希望能够以两种方式选择数据:
1.选择年龄为21岁的人的所有关系
// Returns all of johns relatives who are 21
return People.findOne({
where: { name: 'John' },
include: [{
required: false,
model: Items,
as: 'relationships',
where: { age: 21 }
}]
})
Run Code Online (Sandbox Code Playgroud)
2.选择所有年龄为21岁的关系的人.这将需要接受多个查询,例如:选择所有具有21或/和男性亲属的人.
有任何想法吗?
这是一些完整的代码,我希望它对某人有用。请注意,在此示例中,关系不是相互的,这意味着如果约翰与玛丽有关系,那么玛丽不会自动与约翰建立关系(这更像是约翰跟随玛丽的情况)。但它仍然可以作为如何与显式连接表进行自关联的示例。
let Sequelize = require('sequelize');
let sequelize = new Sequelize('test', 'test', 'test', {dialect: 'mysql'});
let Person = sequelize.define('Person', {
name: Sequelize.STRING,
gender: Sequelize.STRING,
age: Sequelize.INTEGER
});
let PersonRelationship = sequelize.define('PersonRelationship' /* , more fields could be defined here */);
Person.belongsToMany(Person, {as: 'Relationships', through: PersonRelationship, foreignKey: 'from'});
Person.belongsToMany(Person, {as: 'ReverseRelationships', through: PersonRelationship, foreignKey: 'to'});
let john, mary;
sequelize.sync()
.then(() => Person.create({name: 'John', gender: 'm', age: 25}))
.then(p => john = p)
.then(() => Person.create({name: 'Mary', gender: 'f', age: 21}))
.then(p => mary = p)
.then(() => john.addRelationship(mary))
.then(() => john.getRelationships({where: {age: 21}}))
.then(relationships => {
for (let relationship of relationships) {
console.log('Found relationship:', relationship.name);
}
});
Run Code Online (Sandbox Code Playgroud)