magento
EAV(エンティティ属性値)
サーチ…
備考
エンティティ
格納されているデータのタイプに関する情報を格納します。 Magentoの場合、これは顧客、製品、カテゴリなどです。
属性
各エンティティの個々のプロパティ、名前、重量、電子メールアドレスなど
値
与えられたエンティティと属性の値。たとえば、customerエンティティとemail属性を指定し、値に[email protected]を指定することができます。
データベーススキーマ
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プロダクトのリストで使用されます。プロモーションルールに使用されます。システム属性によるソートに使用されます。ストアごとに異なるフラットテーブルがあり、それぞれに異なるストアスコープのエンティティ属性値が含まれます。多言語の値は、言語ごとに異なるストアを持つことによって管理されます。
属性フロントエンド、ソース、およびバックエンドモデルのインタフェースを実装する
フロントエンドインタフェース
/**
* Entity attribute frontend interface
*
* Frontend is providing the user interface for the attribute
*
*/
interface Mage_Eav_Model_Entity_Attribute_Frontend_Interface
{
}
ソースインターフェイス
/**
* Entity attribute select source interface
*
* Source is providing the selection options for user interface
*
*/
interface Mage_Eav_Model_Entity_Attribute_Source_Interface
{
/**
* Retrieve All options
*
* @return array
*/
public function getAllOptions();
/**
* Retrieve Option value text
*
* @param string $value
* @return mixed
*/
public function getOptionText($value);
}
バックエンドインタフェース
/**
* Entity attribute backend interface
*
* Backend is responsible for saving the values of the attribute
* and performing pre and post actions
*
*/
interface Mage_Eav_Model_Entity_Attribute_Backend_Interface
{
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);
/**
* Get entity value id
*
* @param Varien_Object $entity
*/
public function getEntityValueId($entity);
/**
* Set entity value id
*
* @param Varien_Object $entity
* @param int $valueId
*/
public function setEntityValueId($entity, $valueId);
}