2016-11-20 4 views
0

私はここや他の場所で見つけられたすべてを使い果たしました。他の人が成功しているように見えますが、私が何もしていなければ、仮想フィールドを見ることはできません。フィールドとgetterMethodsの両方を無駄にしようとしました。私は最新のSequelizeバージョンが私のプロジェクトにインストールされていることを確認しました。ここでSequelizeで仮想フィールドを動作させることができません

は、オブジェクトの定義です:

var Orderitem = sequelize.define("Orderitem", { 
    description: { type: DataTypes.STRING(80), allowNull: false }, 
    quantity: { type: DataTypes.DECIMAL(9,2), allowNull: false, defaultValue: 0}, 
    unitWeight: { type: DataTypes.DECIMAL(9,2), allowNull: false, defaultValue: 0}, 
    price: { type: DataTypes.DECIMAL(9,2), allowNull: false, defaultValue: 0}, 

    totalPrice: { 
     type: DataTypes.VIRTUAL(DataTypes.DECIMAL(9,2), ['price', 'quantity']), 
     get() { 
     //return this.getDataValue('unitWeight') * this.getDataValue('quantity'); 
     return 195.99; 
     } 
    }, 
    totalWeight: { 
     type: DataTypes.VIRTUAL(DataTypes.DECIMAL(9,2), ['unitWeight', 'quantity']), 
     get() { 
     //return this.getDataValue('unitWeight') * this.getDataValue('quantity'); 
     return 45; 
     } 
    }, 
    }, { 
/* 
    getterMethods: { 
     testFoo: function() { 
      return 'Foo'; 
     }, 
     totalPrice: function() { 
     return this.getDataValue('price') * this.getDataValue('quantity'); 
     }, 
     totalWeight: function() { 
     return this.getDataValue('unitWeight') * this.getDataValue('quantity'); 
     } 
    }, 
*/ 
    classMethods: { 
     associate: function(models) { 
     Orderitem.belongsTo(models.Order, {onDelete: 'CASCADE'}) 
    } 
} 

引用されたとして、VIRTUALタイプと属性の定義を使用しようとしています。私もで試してみたところ、仮想で、追加のタイプや依存関係はありません。テストのために、サンプル戻り値もハードコーディングしました。

getterMethods(ここでコメント化されています)を使用する代わりに、それ以上の効果はありません。

私が見つけることができるすべてによると、find(findOne、findAllなど)を実行できるはずです。これらは、他のすべてのフィールドとともにフィールドとして返す必要があります。最初の4つのフィールドは、データベースから期待値を返します。仮想フィールドはどこにも見つかりません。上記のいずれの方法を使用しても、私は何を間違っていますか?

検索コードは次のとおりです。

OrderController.items = function (orderId, callback) { 
    models.Orderitem.findAll({ 
     //attributes: Object.keys(models.Orderitem.attributes).concat([ 'totalPrice','totalWeight']), 
     where: {orderId: orderId}, raw: true 
    }).then(function(orderitems) { 
     callback(null, orderitems) 
    }).catch(function(error) { 
     callback(error, null) 
    }); 
}; 

エラーがありません予想通り、アイテムが取得され、すべてが仮想フィールドを除く*完璧に動作します。彼らは単に見つからないだけです。生のオブジェクトまたは完全なオブジェクトを要求することで違いはありません。

+0

私のために働くようですが、あなたの検索コードも貼り付けることができますか? – drinchev

+1

オリジナルの投稿に検索コードを追加しました。コメントにうまく書式を設定する方法がないようです。 –

+0

返されたオブジェクト全体を掘り下げる(rawをオフにしている)私の仮想フィールドへの参照は、 オーダーライン[0] .__ proto__ にあります。その属性プロパティは、自分の仮想フィールドを含む名前の配列です。すべての属性のフィールドです - すべては未定義です*上記のハード・フィールドの値は199.95と45です。 rawをtrueに設定すると、これは処理されません。さらにテストする必要があるので、他の2つのフィールドの製品にすると、これらは未定義のままです。 –

答えて

0

仮想は定義されたとおりに動作します。

問題は結果を取得する方法です。クエリでrawオプションを使用することにより、SequelizeはDAOを作成しないと仮定しているため、仮想を評価せず、インスタンス自体を作成しません。

OrderController.items = function (orderId, callback) { 
    models.Orderitem.findAll({  
     where: {orderId: orderId} // commenting out `raw: true` 
    }).then(function(orderitems) { 
     if (orderitems.length > 0) { 
      console.log(orderitems[0].totalPrice); 
     }; 
     callback(null, orderitems) 
    }).catch(function(error) { 
     callback(error, null) 
    }); 
}; 

あなたはSequelize Documentationrawオプションの詳細を読むことができます。

+0

ありがとうございました。 rawオプションのドキュメントは、仮想フィールドが動作しないようにすることについて何も言わないので、私はそのことをどのように知っているのか分かりません。 仮想属性を取得するには、rawを使用できず、JSONに変換する必要がありますか?両方とも、特に生のまま使用することができないと思われる場合、パフォーマンスが低下する可能性があります。 –

+0

パフォーマンスが低下します。はい、あなたは正しいです。次に、仮想を使うことはできず、あなたが望む値で 'raw'オブジェクトを充実させることができます。'raw'オプションはあなたの結果をインスタンス化しないので、バーチャルだけでなくタイプなども考慮しません。あなたは基本的にあなたのORM内のすべてのロジックをバイパスします。これは高速ですが、なぜORMが必要ですまず第一に。 – drinchev

+0

まず、現在動作しています。ありがとうございました。 アプリケーションがサーバー側でレンダリングされ、オブジェクトがクライアント側に送信されていないか、操作されていません。したがって、その目的のために完全なオブジェクトは必要ありません。サーバー側では、rawは実際には問題ではないので、仮想テーブルやその他の良いものを得るためには、実際には問題ではありません。しかし、JSONに変換してオブジェクトに解析してレンダリングできるようにすると、本当にサイクルが浪費されます。

関連する問題