Seguici su:

Magento 2 Model ed Entity – Semplice e EAV

Magento 2 Data Store EAV

Magento 2 Model ed Entity – Semplice e EAV

I Models e le Entities su Magento 2

Su Magento 2, per poter operare con le tabelle, si utilizzano Model e Entity ospitati nella directory Models del singolo componente. Alcuni di questi sono persistenti e altri non persistenti. Tanti moduli di Magento 2 utilizzano il database per salvare i dati in modi persistente e quindi le entità sono importantissime se si vuole sviluppare un proprio componente che salvi i dati nel database. Magento utilizza tre tipi di classi che permetto di effettuare le operazioni CRUD (CREATE, READ, UPDATE, DELETE), le classiche operazioni che si effettuano per la persistenza dei dati:

  • model
  • resource model
  • collection

I modelli di persistenza di Magento 2 sono di due tipi, semplici o EAV (Entity-Attribute-Value)

Modello semplice

Prendiamo per esempio il modello semplice di persistenza delle Review vendor/magento/module-reviewche serve per le recensioni del prodotto. Questo modulo utilizza il modello di persistenza semplice, nella directory Model,  quindi come detto in precedenza utilizza le tre classi

  • model class Review extends \Magento\Framework\Model\AbstractModel nella root directory Model
  • resource model class Review extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb nella directory Model/ResouceModel 
  • collection class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection nella directory Model/ResouceModel/Review

Modello EAV ( Entity-Attribute-Value )

Per questo modello possiamo utilizzare il modulo di magento Customer vendor/magento/module-customer che si utilizza per salvare i clienti. Questo modulo utilizza il modello di  persistenza EAV, nella directory Model

  • model class Cusotmer extends \Magento\Framework\Model\AbstractModel nella root directory Model
  • resource model class Review extends Magento\Eav\Model\Entity\VersionControl\AbstractEntity nella directory Model/ResouceModel 
  • collection class Collection extends \Magento\Eav\Model\Entity\Collection\VersionControl\AbstractCollection nella directory Model/ResouceModel/Customer

Come possiamo vedere sopra, le differenze tra i due modelli, semplice e EAV, sono nelle classi resource model e collection. La classe resource model è il nostro collegamento al database.

Quando inseriamo una review, nel primo caso, i dati saranno salvati nel database utilizzando il classico modello orizzontale, quindi i dati saranno salvati in una singola tabella, che in questo caso è la tabella review. Se invece salviamo un cliente, i dati saranno salvati utilizzando un modello verticale nel database. Questo vuol dire che i dati saranno salvati in varie tabelle in base ai tipi di dati. Per i clienti quindi i dati saranno salvati nelle seguenti tabelle:

  • customer_entity
  • customer_entity_datetime
  • customer_entity_decimal
  • customer_entity_int
  • customer_entity_text
  • customer_entity_varchar

Come si deduce dai nomi delle tabelle, ogni tipo di dato sarà salvato in una tabella. Magento mantiene un indice per salvare i dati nelle tabelle precedenti all’interno della tabella eav_attribute nel campo backend_type visualizzabile utilizzando la seguente query in MySQL:

SELECT DISTINCT backend_type FROM eav_attribute;

Questa query estrae tutti valori  non (DISTINCT = elimina i duplicati) contenuti nel campo backend_type della tabella eav_attribute :

  • static gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_entity
  • varchar gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_varchar
  • int gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_int
  • text gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_text
  • datetime gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_datetime
  • decimal gli attributi con questo valore saranno salvati nelle tabelle <entity_name>_decimal

Il resto delle informazioni rilevanti sono sparse nelle tabelle eav_attribute_*. Per capite tutti i modelli di entità EAV che Magento utilizza nel suo framework possiamo utilizzare la seguente query.

SELECT entity_type_code, entity_model FROM eav_entity_type;
  • customer utilizza l’entity model Magento\Customer\Model\ResourceModel\Customer
  • customer_address utilizza l’entity model Magento\Customer\Model\ResourceModel\Address
  • catalog_category utilizza l’entity model Magento\Customer\Model\ResourceModel\Category
  • catalog_product utilizza l’entity model Magento\Customer\Model\ResourceModel\Product
  • order utilizza l’entity model Magento\Customer\Model\ResourceModel\Order
  • invoice utilizza l’entity model Magento\Customer\Model\ResourceModel\Invoice
  • creditmemo utilizza l’entity model Magento\Customer\Model\ResourceModel\Creditmemo
  • shipment utilizza l’entity model Magento\Customer\Model\ResourceModel\Shipment

Di queste solo quattro utilizzano a pieno il modello EAV, come indicato dalla seguente query.

SELECT DISTINCT entity_type_id FROM eav_attribute;
  • customer
  • customer_address
  • catalog_category
  • catalog_product

Le altre sono semplici tabelle flat dato che i loro dati vengono salvati in  modo orizzontale in una sola tabella. Come si evince, il modello EAV, risulta molto più complesso (dato che i dati vengono sparpagliati in tante tabelle ). Sono utili soprattutto per creare attributi dinamici tramite un interfaccia come succede nel caso dei prodotti di magento che hanno possono avere molte combinazioni. Quindi la maggior parte delle volte si utilizza il modello semplice per poter salvare dati in una tabella.

Pasquale Guarino

pasquale.guarino80@gmail.com

WP2Social Auto Publish Powered By : XYZScripts.com