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:
I modelli di persistenza di Magento 2 sono di due tipi, semplici o EAV (Entity-Attribute-Value)
Prendiamo per esempio il modello semplice di persistenza delle Review vendor/magento/module-review che 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
Review extends \Magento\Framework\Model\AbstractModel nella root directory ModelReview extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb nella directory Model/ResouceModel class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection nella directory Model/ResouceModel/ReviewPer 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
class Cusotmer extends \Magento\Framework\Model\AbstractModel nella root directory Modelclass Review extends Magento\Eav\Model\Entity\VersionControl\AbstractEntity nella directory Model/ResouceModel class Collection extends \Magento\Eav\Model\Entity\Collection\VersionControl\AbstractCollection nella directory Model/ResouceModel/CustomerCome 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:
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 :
<entity_name>_entity<entity_name>_varchar<entity_name>_int<entity_name>_text<entity_name>_datetime<entity_name>_decimalIl 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;
Magento\Customer\Model\ResourceModel\CustomerMagento\Customer\Model\ResourceModel\AddressMagento\Customer\Model\ResourceModel\CategoryMagento\Customer\Model\ResourceModel\ProductMagento\Customer\Model\ResourceModel\OrderMagento\Customer\Model\ResourceModel\InvoiceMagento\Customer\Model\ResourceModel\CreditmemoMagento\Customer\Model\ResourceModel\ShipmentDi queste solo quattro utilizzano a pieno il modello EAV, come indicato dalla seguente query.
SELECT DISTINCT entity_type_id FROM eav_attribute;
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.