私の推測では、それは一部のレガシーであり、開発者が「一般的な」エンティティ/モデルを実装するための「便利な」パターンです。
あなたが述べたように、関連するテーブルは通常空です。その理由は、コアEAVエンティティのいずれもこの「デフォルト」エンティティテーブル構造を使用していないからです。これらは、1.8インストールのエンティティテーブルです。
mysql> select distinct(entity_table) from eav_entity_type;
+-------------------------+
| entity_table |
+-------------------------+
| customer/entity |
| customer/address_entity |
| sales/order |
| sales/order_entity |
| catalog/category |
| catalog/product |
| sales/quote |
| sales/quote_address |
| sales/quote_entity |
| sales/quote_item |
| sales/invoice |
+-------------------------+
11 rows in set (0.00 sec)
一例として、顧客のモデルを使用して、我々は、リソース・モデルがあることがわかりますMage_Customer_Model_Resource_Customer
拡張しMage_Eav_Model_Entity_Abstract
、ソースを。
注:前の1.6に顧客エンティティのリソースモデルをしてMage_Customer_Model_Entity_Customer
も、拡張Mage_Eav_Model_Entity_Abstract
、ソース。
私たちが調べるとMage_Eav_Model_Entity_Abstract
、クラスを我々は見つけるgetEntityTable
方法を。このメソッドは、一般的なCRUD操作中にクエリを構築するときに使用するテーブルを決定するために使用されます。興味深い別の方法は getValueTablePrefix
です。これは、データ「タイプ」のテーブルのテーブルの接頭辞を決定し*_datetime
、*_decimal
、*_varchar
のように。
それらのメソッドのソースを覗きます(こことここ)。
public function getEntityTable()
{
if (!$this->_entityTable) {
$table = $this->getEntityType()->getEntityTable();
if (!$table) {
$table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
}
$this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
}
return $this->_entityTable;
}
上記のメソッドでは、エンティティタイプがカスタムテーブルを定義しない場合、デフォルトでになることがわかりますMage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
。その定数の値はで'eav/entity'
、これは順番にeav_entity
テーブルに変換されます(アプリケーションに設定済みのテーブルプレフィックスがないと仮定します)。私が言及した2番目の方法は、指定されたエンティティに何も構成されていない場合、プレフィックスとしてこのテーブルにフォールバックします。列のeav_entity_type
表の値を調べると、value_table_prefix
それらがすべてであることがわかりますNULL
。
public function getValueTablePrefix()
{
if (!$this->_valueTablePrefix) {
$prefix = (string)$this->getEntityType()->getValueTablePrefix();
if (!empty($prefix)) {
$this->_valueTablePrefix = $prefix;
/**
* entity type prefix include DB table name prefix
*/
//Mage::getSingleton('core/resource')->getTableName($prefix);
} else {
$this->_valueTablePrefix = $this->getEntityTable();
}
}
return $this->_valueTablePrefix;
}
メソッドのロジックはかなり単純です。値のプレフィックスが定義されていない場合、エンティティテーブル名をプレフィックスとして使用します。
これらのテーブルは長い間Magentoに存在しているため、完全に削除するよりも下位互換性を保つために残しておくのがベストだと思います。私が考えていたのは、他の開発者がいくつかのクラスを拡張し、管理者によって変更できる「動的な」属性を持つことができる、使いやすいエンティティ/モデル構造でした(カタログ製品と顧客モデルを参照)。残念ながら、上記のパターンの実装と実践はうまくスケールしていないようで、問題につながります。おそらくドキュメントやサンプルユースケースの不足やパフォーマンスの低下が原因で、この構造が実際に使用されたことはありません。
私はコア開発者(または考古学者)ではありませんが、コードとデータ構造から収集したものです。