Looking for magento Answers? Try Ask4KnowledgeBase
Looking for magento Keywords? Try Ask4Keywords

magentoEAV(エンティティ属性値)


備考

エンティティ

格納されているデータのタイプに関する情報を格納します。 Magentoの場合、これは顧客、製品、カテゴリなどです。

属性

各エンティティの個々のプロパティ、名前、重量、電子メールアドレスなど

与えられたエンティティと属性の値。たとえば、customerエンティティとemail属性を指定し、値にhello@example.comを指定することができます。

データベーススキーマ

eav_entity

エンティティテーブル

eav_entity_attribute

属性テーブル

eav_entity_ {type}

値テーブル。型はdatetime、decimals、int、text、varcharです。

eav_entity_varcharテーブルは、日付または整数が値に適している場合でも、値にvarchar型があることに注意してください。

モデルとリソースモデル

Mage / Eav / Model / Resource内のすべてのモデルはMysql4であり、リソース・モデルです。

さらにEntity / Abstract.phpおよびEntity / Setup.php。

フラット対EAV

EAVモデルはより複雑であり、複数のテーブルを節約しロードするロジックを提供しますが、フラットモデルまたは標準モデルは比較的簡単です(従来の)。

標準モデルは主に、データセッターとゲッターを単一のテーブルで操作してプロパティーを管理します。 EAVモデルは、主にその属性モデルを管理します。標準モデルは、データをテーブルに保存し、テーブルからロードするだけです。 EAVモデルは、データの保存後(属性の挿入、更新、削除を含む)に基本データをロードして属性を保存した後、すべての(または特定のセットの)属性をロードします。

EAVリソースモデルの例

EAVストレージスキーマを使用してエンティティを検索するには、Mage_Eav_Model_Entity_Abstractという文字列を検索します。これにより、EAV構造に基づいたすべてのリソース・モデルが明らかになります。しかし、結果として得られるリストには、もはや使用されていないMage_Salesモジュールからの廃止されたクラスが多数含まれます。

EAVストレージスキーマを使用するエンティティを含む唯一のモジュールは、Mage_Catalog(カテゴリと製品)とMage_Customer(顧客とアドレス)です。

顧客グループはフラットテーブルストレージスキーマを使用します。すべての販売エンティティは、Magento 1.4のリリースでフラットテーブルエンティティに変換されました。

EAVが使用される理由は、エンティティが不確定な数のプロパティを持つ可能性があり、柔軟性を維持できるためです。たとえば、Customerエンティティ(EAVエンティティ)に新しい属性を追加する場合、この新しい属性を追加するためにデータベーステーブルを変更する必要はありません。

利点

柔軟性データベーススキーマはモデルで変更する必要はありません

短所

  • 非効率的な

20列を返すクエリは通常、EAVで20回の自己結合で構成されます。しかし、Mage_Eavモジュールは一般的に、属性値データをロードするために結合を使用しません。代わりに、結合選択が使用されます。結合は、EAVコレクションのフィルタリングにのみ使用されます。

  • サブタイプ間の関係のメカニズムがない
  • エンティティサブタイプのグループ化がありません

ウェブサイトとストアスコープ

EAV内でウェブサイトとストアスコープ属性値を処理するために、store_id値がカタログエンティティ上に存在し、core_storeにリンクするスコープを示す。通常のストア(ストアビュー)に加えて、グローバル値であるストア「0」もあります。特定の店舗では、まず現在の店舗のエンティティ値を確認した後、グローバルエンティティにフォールバックします。 Mage_Customer EAVエンティティには、store_idスコープの列がありません。

挿入、更新、削除

属性に対して挿入、更新、または削除を実行する必要があるかどうかを判断するために、元のオブジェクトとの比較が行われます。元のオブジェクトは、基本的に、エンティティがデータベースから取得されたときのデータオブジェクトの複製です。

  • 属性が元々存在し、その新しい値が空でない場合。更新します。
  • 属性が元々存在していても、新しい値が空に設定されている場合削除します。 - 属性が元々存在せず、新しい値が空でない場合。挿入されます。

属性管理

属性モデル

属性モデルデータベースフォームの属性を表し、そのロジックはすべての属性にわたって標準であり、変更することは困難です。

フロントエンドモデル

属性のフロントエンドへのインタフェースであり、フロントエンドで属性に必要なすべてのロジックを提供します(例:イメージのgetUrl()メソッド)。

バックエンドモデル

これらは、属性がデータベースに保存される前に属性の検証を実行します。たとえば、パスワードバックエンドモデルはパスワードを保存する前にハッシュに変換します。また、保存する前にパスワードとパスワードの確認が一致していることを確認します。

ソースモデル

属性に使用可能なオプションを設定するために使用します。たとえば、catalog / product_statusが有効および無効です。

必要なメソッド

ソースモデルには次のものが必要です。

<?php
    public function getAllOptions();
    public function getOptionText($value);
?>

通常、抽象ソースモデルMage_Eav_Model_Entity_Attribute_Source_AbstractにはgetOptionText()の実装がすでに存在するため、getAllOptions()のみを実装する必要があります。

フロントエンドモデルはgetValue()メソッドを必要としません。

バックエンドモデルには次のものが必要です。

<?php
    public function getTable();
    public function isStatic();
    public function getType();
    public function getEntityIdField();
    public function setValueId($valueId);
    public function getValueId();
    public function afterLoad($object);
    public function beforeSave($object);
    public function afterSave($object);
    public function beforeDelete($object);
    public function afterDelete($object);
    public function getEntityValueId($entity);
    public function setEntityValidId($entity, $valueId);
?>

これらのメソッドはすべて、抽象的なバックエンドモデルMage_Eav_Model_Entity_Attribute_Backend_Abstractに実装されています。カスタムバックエンドモデルの場合、カスタマイズが必要なメソッドのみをオーバーライドする必要があります。

システム構成ソースモデル

EAV属性には使用できません。 EAVソースモデルはgetAllOptionsメソッドを実装し、adminhtmlソースモデルはtoOptionArray()メソッドを実装します。

デフォルトのシステム構成ソースモデルは、Mage / Adminhtml / Model / System / Config / Source /にあります。

属性ソースモデル

属性ソースモデルの目的は、selectおよびmultiselect属性のオプションと値のリストを提供することです。また、必要に応じて列情報をカタログフラットテーブルインデクサに供給します。

属性のすべてのオプションのリストを取得するには、次の手順を実行します。

<?php
    $options = $attribute->getSource()->getAllOptions(false);

    // or for admin
    $options = $_attribute->getSource()->getAllOptions(true, true);
?>

デフォルト属性モデル

フロントエンド、バックエンド、または - 選択またはマルチ選択属性 - ソースモデルのクラスが指定されていない場合、デフォルトのクラスが使用されます。

デフォルトの属性フロントエンドモデルはMage_Eav_Model_Entity_Attribute_Frontend_Defaultです。

デフォルトの属性バックエンドモデルは属性コードに依存し、メソッドMage_Eav_Model_Entity_Attribute :: _ getDefaultBackendModel()で決定されます。

<?php
    protected function _getDefaultBackendModel()
    {
        switch ($this->getAttributeCode()) {
            case 'created_at':
                return 'eav/entity_attribute_backend_time_created';

            case 'updated_at':
                return 'eav/entity_attribute_backend_time_updated';

            case 'store_id':
                return 'eav/entity_attribute_backend_store';

            case 'increment_id':
                return 'eav/entity_attribute_backend_increment';
        }

        return parent::_getDefaultBackendModel();
    }
?>

メソッドが最後の行に渡る場合、Mage_Eav_Model_Entity_Attribute_Backend_Defaultが使用されます。

デフォルトのソースモデルはMage_Eav_Model_Entity_Attribute_Source_Tableに設定されています。これは、カタログモジュール属性モデルで設定されます。 eavモジュールで指定されたデフォルトの設定ソースモデルは使用されません。

属性を追加する

EAV属性を追加するには、セットアップクラスを拡張してMage_Eav_Model_Entity_Setupを使用します。

addAttribute()属性を作成し、それをグループおよびセットに追加する(デフォルトを含む)、またはすでに存在する場合は更新する。updateAttribute()属性データのみを更新する。カスタムセットアップクラスを使用すると、これらのメソッドを拡張したり、追加のデータを追加したり、必要な引数を単純化することができます。

フラットテーブル

フラットなカタログ属性はインデクサによって管理されます:

Mage_Catalog_Model_Resource_Product_Flat_Indexer :: updateAttribute()Mage_Catalog_Model_Resource_Category_Flat :: synchronize()製品属性がフラットテーブルに追加される(Mage_Catalog_Model_Resource_Product_Flat_Indexer :: getAttributeCodes()を参照)。

Static(バックエンドタイプ)Filterableプロダクトのリストで使用されます。プロモーションルールに使用されます。システム属性によるソートに使用されます。ストアごとに異なるフラットテーブルがあり、それぞれに異なるストアスコープのエンティティ属性値が含まれます。多言語の値は、言語ごとに異なるストアを持つことによって管理されます。

EAV(エンティティ属性値) 関連する例