수색…


비고

실재

저장되는 데이터 유형에 대한 정보를 저장합니다. 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 저장 스키마를 사용하는 엔티티를 찾으려면 문자열 extends 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 범위 열이 없습니다.

삽입, 업데이트 및 삭제

속성에서 삽입, 갱신 또는 h 제를 수행해야하는지 판별하려면 원래 오브젝트와의 비교가 이루어져야합니다. 원래 개체는 데이터베이스에서 엔터티를 검색 할 때 기본적으로 데이터 개체의 복제본입니다.

  • 속성이 원래 존재하고 새 값이 비어 있지 않으면; 그것은 업데이 트합니다.
  • 속성이 원래 존재하지만 새 값이 비어있는 경우 삭제합니다. - 속성이 원래 존재하지 않고 새 값이 비어 있지 않은 경우 그것은 삽입합니다.

특성 관리

속성 모델

속성 모델 데이터베이스 양식의 특성을 나타내며, 해당 특성은 모든 특성에서 표준이며 변경하기 어렵습니다 .

프론트 엔드 모델

프론트 엔드에 대한 속성의 인터페이스이며 프론트 엔드에서 속성에 필요한 모든 로직을 제공합니다 (예 : 이미지의 getUrl () 메소드).

백엔드 모델

이들은 데이터베이스에 저장되기 전에 속성에 대해 유효성 검증을 수행합니다. 예를 들어, 암호 백엔드 모델은 암호를 저장하기 전에 암호를 해시로 변환합니다. 또한 저장하기 전에 암호와 암호 확인이 일치하는지 확인합니다.

소스 모델

속성에 사용할 수있는 옵션을 채우는 데 사용됩니다. 예 : catalog / product_status가 활성화 및 비활성화되었습니다.

필수 메소드

소스 모델에는 다음이 필요합니다.

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

일반적으로 getAllOptions () 만 구현해야하지만 getOptionText ()에 대한 구현이 추상 소스 모델 Mage_Eav_Model_Entity_Attribute_Source_Abstract에 이미 있으므로

프론트 엔드 모델은 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);
?>

기본 특성 모델

프론트 엔드, 백엔드 또는 - select 또는 multiselect 속성의 소스 모델로 클래스가 지정되지 않은 경우 기본 클래스가 사용됩니다.

기본 속성 프론트 엔드 모델은 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 속성을 추가하려면 setup 클래스를 확장하여 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 () 참조).

정적 (백엔드 유형) 필터링 가능 상품 목록에 사용됨 프로모션 규칙에 사용됨 시스템 속성 별 정렬에 사용됨 각 상점에 대해 다른 플랫 테이블이 있으며 각 테이블에는 다른 상점 범위 엔티티 속성 값이 들어 있습니다. 다국어 값은 각 언어에 대해 서로 다른 상점을 보유하여 관리됩니다.

속성 프론트 엔드, 소스 및 백엔드 모델의 인터페이스 구현

프론트 엔드 인터페이스

/**
* 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);
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow