20

問題は、状態型オブジェクトを積極的にロードしない関係 hasOne を処理できないことです。

すべてのクエリは、既存のテーブルに対して実行されます。

これが顧客テーブルです。重要なのはcst_state_typeフィールドです。

module.exports = function(sequelize, DataTypes) {

    return sequelize.define('customer', {

        customer: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: true,
            validate: {
                isNumeric: true
            }
        },
        first_name: {
            type: DataTypes.STRING(100),
            validate: {
                isAlphanumeric: true
            }
        },
        last_name: DataTypes.STRING(100),
        identity_code: {
            type: DataTypes.STRING(20),
            allowNull: true,
            validate: {
                isNumeric: true
            }
        },
        note: DataTypes.STRING(1000),
        birth_date: DataTypes.DATE,


        created_by: DataTypes.INTEGER,
        updated_by: DataTypes.INTEGER,

        cst_type: DataTypes.INTEGER,
        cst_state_type:  {
            type: DataTypes.INTEGER,
        }

    }, {
        tableName: 'customer',

        updatedAt: 'updated',
        createdAt: 'created',
        timestamps: true
    });
};

cst_state_type テーブル:

module.exports = function(sequelize, DataTypes) {

    return sequelize.define('StateType', {

        cst_state_type: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            validate: {
            }
        },
        name: DataTypes.STRING(100),
    }, {
        tableName: 'cst_state_type',
        timestamps: false
    });
};

関係の説明:

  global.db.Customer.hasOne(global.db.StateType, {
    foreignKey: 'cst_state_type',
    as: 'state_type'
  });

  global.db.StateType.belongsTo(global.db.Customer, {
    foreignKey: 'cst_state_type'
  });

そして熱心な読み込みクエリを作成します:

    db.Customer.findAll( {
        include: [
            { model: db.Address, as: 'addresses' },
            { model: db.StateType, as: 'state_type' }
        ]
    })
        .success(function (customers) {
            res.json(200, customers);
        })
        .fail(function (error) {
            res.json(500, { msg: error });
        });
4

2 に答える 2

28

ご回答ありがとうございます、とても助かりました。クラスメソッドを使用して、リレーションをモデルに直接追加することもできます。以下に例を追加しました。これがお役に立てば幸いです。

ユーザーモデル (ファイル)

module.exports = function(sequelize, DataTypes){
    var User = sequelize.define(
        'User', {
            name: {
                type: DataTypes.STRING,
                allowNull: false
            }
        },
        {
            classMethods:{
                associate:function(models){
                    User.hasMany(models.Comment, { foreignKey: 'userId'} );
                }
            }
        }

    );
    return User;
};

コメントモデル (ファイル):

module.exports = function(sequelize, DataTypes){
    var Comment = sequelize.define(
        'Comment', {
            text: {
                type: DataTypes.STRING,
                allowNull: false
            }
        },
        {
            classMethods:{
                associate:function(models){
                    Comment.belongsTo(models.User, { foreignKey:'userId'} );
                }
            }
        }

    );
    return Comment;
};

外部キーを設定する必要はありません。外部キーを指定しない場合は、sequelize が処理します。

次に、クエリで:

models.Comment.find({
        where: { id: id },
        include: [
            models.User
        ],
        limit: 1
    })
于 2014-04-02T13:57:11.280 に答える
9

エラーがあなたの関連付けのどこかにあると確信しています。テーブル構造を説明した方法から、関連付けは次のようになります。

global.db.Customer.belongsTo(global.db.StateType, {
    foreignKey: 'cst_state_type',
    as: 'state_type'
});

global.db.StateType.hasMany(global.db.Customer, {
    foreignKey: 'cst_state_type'
});

私が理解しているように、同じ状態が多くの顧客に割り当てられる可能性があるため、StateType.hasMany. customer -> statetype からの関係は「バック・アソシエーション」であり、外部キーが customer テーブルにあることを意味します。そのために必要なbelongsTo

于 2013-10-02T07:39:33.637 に答える