Sequelize.js 通过Sequelize中的多个链接表包含数据

Sequelize.js 通过Sequelize中的多个链接表包含数据,sequelize.js,Sequelize.js,我在MySQL数据库中有以下表格: 带{id,name,…} 人物{id,姓名,…} //一个人可以在一个或多个乐队中 //乐队有一个或多个成员 BandMembers{id,personId,bandId,isGuest,} 文书{id,name,…} //乐队成员可以在同一特定乐队中演奏一种或多种乐器 //同一乐队的几个成员可以演奏相同的乐器(例如,两名吉他手,所有成员都唱歌等) //一个人可以在他或她所在的不同乐队中演奏不同的乐器 BandMembersRoles{id,membe

我在MySQL数据库中有以下表格:

  • 带{id,name,…}

  • 人物{id,姓名,…}

  • //一个人可以在一个或多个乐队中 //乐队有一个或多个成员

  • BandMembers{id,personId,bandId,isGuest,}

  • 文书{id,name,…}

  • //乐队成员可以在同一特定乐队中演奏一种或多种乐器 //同一乐队的几个成员可以演奏相同的乐器(例如,两名吉他手,所有成员都唱歌等) //一个人可以在他或她所在的不同乐队中演奏不同的乐器

  • BandMembersRoles{id,memberId,instrumentId,…}
  • 现在,如果我想获取特定乐队的所有成员,我将编写如下查询:

    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。