Sequelize.js 通过Sequelize中的多个链接表包含数据
我在MySQL数据库中有以下表格:Sequelize.js 通过Sequelize中的多个链接表包含数据,sequelize.js,Sequelize.js,我在MySQL数据库中有以下表格: 带{id,name,…} 人物{id,姓名,…} //一个人可以在一个或多个乐队中 //乐队有一个或多个成员 BandMembers{id,personId,bandId,isGuest,} 文书{id,name,…} //乐队成员可以在同一特定乐队中演奏一种或多种乐器 //同一乐队的几个成员可以演奏相同的乐器(例如,两名吉他手,所有成员都唱歌等) //一个人可以在他或她所在的不同乐队中演奏不同的乐器 BandMembersRoles{id,membe
SELECT
p.id AS personId,
p.name,
bm.isGuest,
bm.id AS bandMemberId
FROM people AS p
JOIN BandMembers AS bm
ON p.id = bm.Id
WHERE bm.bandId = 1
// First, store the MySQL Query above in $personQuery
$memStmt = $conn->prepare($personQuery);
$memStmt->bindParam(':bandId', $bandId);
$memStmt->execute();
$memArr = array();
while ($mem = $memStmt->fetch(PDO::FETCH_ASSOC)) {
extract($mem);
// *** Get Roles
$roleArr = array();
$roleQuery = "SELECT
r.id AS id,
r.name
FROM roles AS r
JOIN BandMembersRoles AS bmr
ON bm.id = r.memberId
WHERE bm.id = :bandMemberId;
$roleStmt = $conn->prepare($roleQuery);
$roleStmt->bindParam(':m2b_id', $m2b_id);
$roleStmt->execute();
while ($role = $roleStmt->fetch(PDO::FETCH_ASSOC)) {
extract($role);
$roleItem = array(
'id' => (int)$id,
'name' => $name
);
array_push($roleArr, $roleItem);
}
// *** End of Get Roles
// and the add it to member object...
在Sequelize中,同样的结果将通过以下方式实现:
// In models config:
db.People.belongsToMany(db.Bands, {
through: 'BandMembers',
foreignKey: "personId"
})
db.Bands.belongsToMany(db.People, {
through: 'BandMembers',
as: 'members',
foreignKey: "bandId"
})
. . .
// In models config:
exports.findByBand = (req, res) => {
Person.findAll({
// This is a way to get band members only by specific band, please let me know if there is more elegant way for this:
include: [{
model: Band,
attributes: [],
where: { id: req.params.id }
}],
attributes: [
['id', 'personId'],
[db.Sequelize.col('bands.BandMembers.id'), 'bandMemberId'],
['name'],
[db.Sequelize.col('bands.BandMembers.isGuest'), 'isGuest']
]
})
.then(data => {
// ...
})
}
现在,如果想要每个乐队成员在特定乐队中的角色,我将在PHP中创建如下代码:
SELECT
p.id AS personId,
p.name,
bm.isGuest,
bm.id AS bandMemberId
FROM people AS p
JOIN BandMembers AS bm
ON p.id = bm.Id
WHERE bm.bandId = 1
// First, store the MySQL Query above in $personQuery
$memStmt = $conn->prepare($personQuery);
$memStmt->bindParam(':bandId', $bandId);
$memStmt->execute();
$memArr = array();
while ($mem = $memStmt->fetch(PDO::FETCH_ASSOC)) {
extract($mem);
// *** Get Roles
$roleArr = array();
$roleQuery = "SELECT
r.id AS id,
r.name
FROM roles AS r
JOIN BandMembersRoles AS bmr
ON bm.id = r.memberId
WHERE bm.id = :bandMemberId;
$roleStmt = $conn->prepare($roleQuery);
$roleStmt->bindParam(':m2b_id', $m2b_id);
$roleStmt->execute();
while ($role = $roleStmt->fetch(PDO::FETCH_ASSOC)) {
extract($role);
$roleItem = array(
'id' => (int)$id,
'name' => $name
);
array_push($roleArr, $roleItem);
}
// *** End of Get Roles
// and the add it to member object...
所以,我的问题是:在Sequelize中,是否可以通过一些包含代码或任何其他方式包含乐队成员的乐器
谢谢大家! 您可以通过关系和外键来实现这一点,例如
db.People.hasMany(db.Instruments,{foreignKey:“personId”})
并且您必须在查询中包含模型。人与工具之间没有直接关系。他们在所在乐队的背景下是相关的。每个人可以在几个乐队中,他们在不同乐队中的角色可能不同。所以实际上这个方案是这样的:有人,有乐队,有一个链接表,它连接人和乐队(多对多关系),这个链接表有它的id,我们称它为p2b_id(待续…[…续]还有一个乐器表,它包含所有可用乐器的列表,还有一个链接表,它连接乐器和乐队中的人,而不是人本身。也就是说,这个带内个人对个人的外键不是个人表中的个人id,而是他们在第一个链接表(个人对带)中的id,我们称之为p2b_id。