Recuperando Datos


En este punto, hemos recuperado con éxito una entidad producto y los atributos específicos que se aplican a esa entidad, y ahora es el momento de empezar a recuperar los valores reales. Con el fin de ejecutar simplemente el ejemplo (y la consulta), sólo trataremos de recuperar el atributo name de nuestros productos.

Pero cómo sabemos en qué tabla se almacenan los valores de nuestros atributos? Bueno, por suerte, Magento está siguiendo una convención de nomenclatura para nombrar las tablas. Si inspeccionamos la estructura de la base de datos, nos daremos cuenta de que hay varias tablas usando el prefijo catalog_product_entity:

  • catalog_product_entity
  • catalog_product_entity_datetime
  • catalog_product_entity_decimal
  • catalog_product_entity_int
  • catalog_product_entity_text
  • catalog_product_entity_varchar
  • catalog_product_entity_gallery
  • catalog_product_entity_media_gallery
  • catalog_product_entity_tier_price

Pero, momento, ¿cómo sabemos que es la tabla correcta para consultar el nombre de los valores de los atributos? Si estabas prestando atención, ya has visto la respuesta. ¿Recuerdas que la tabla eav_attribute tenía una columna llamada backend_type?

El EAV de Magento almacena cada atributo en una tabla diferente en función del tipo de backend de dicho atributo. Si queremos confirmar el tipo backend de nuestro nombre, podemos hacerlo ejecutando el siguiente código:
 

SELECT * FROM `eav_attribute` WHERE `entity_type_id` = 4 AND `attribute_code` = 'name';

Y nosotros deberíamos ver, como resultado, que el tipo backend es varchar y que los valores para este atributo se almacenan en la tabla catalog_product_entity_varchar. Vamos a inspeccionar esta tabla:

La tabla catalog_product_entity_varchar está formada por sólo seis columnas:

  • value_id: El valor del atributo es un identificador único y una clave principal.
  • entity_type_id: Este valor corresponde al ID del tipo de entidad.
  • attribute_id: Se trata de una llave foranea que se relaciona con el valor de nuestra tabla eav_entity.
  • store_id: Se trata de llave foránea que corresponde al valor del atributo de una sotreview.
  • entity_id: Se trata de llave foránea a la tabla de entidad correspondiente; en este caso, es catalog_product_entity
  • value: Este es el valor real que queremos recuperar

Dependiendo de la configuración de los atributos, podemos tener como valor a global, lo que significa que se aplica en todas las vistas de la tienda o un valor por storeview.

Ahora que por fin tenemos todas las tablas que necesitamos para recuperar la información del producto, podemos construir nuestra consulta:

SELECT p.entity_id AS product_id, var.value AS product_name, p.sku AS product_sku
FROM catalog_product_entity p, eav_attribute eav, catalog_product_entity_varchar var
WHERE p.entity_type_id = eav.entity_type_id
AND var.entity_id = p.entity_id
AND eav.attribute_code = 'name'
AND eav.attribute_id = var.attribute_id
LIMIT 0 , 30


Como resultado de nuestra consulta, deberíamos ver un conjunto de resultados con tres columnas: product_id, product_name, y product_sku . Así que, vamos a dar un paso atrás por un segundo a fin de obtener los nombres de productos con SKUs. Solo con  SQL crudo, tendríamos que escribir cinco líneas de una consulta SQL, y sólo sería para la recuperación de dos valores de nuestros productos: de una sola tabla de valores de EAV si queremos recuperar un campo numérico, como price, o de un valor de texto, tal como product.

Dicho esto, vamos a ver cómo podemos recuperar la misma información de productos mediante el uso de la Magento ORM:

  • Nuestro primer paso es crear una instancia de la colección del producto: $coleccion = Mage::getModel('catalog/product')->getCollection();
  • Entonces, le diremos específicamente a Magento que seleccione el atributo name$coleccion->addAttributeToSelect('name');
  • Ahora que organice la colección por name$coleccion->setOrder('name', 'asc');
  • Y, por último, le diremos a Magento que cargue la colección: $coleccion->load();
  • El resultado final es una colección de todos los productos de la tienda ordenada por name; podemos inspeccionar la consulta real ejecutando SQL: echo $coleccion->getSelect()->__toString();

Con la ayuda de sólo tres líneas de código, podemos decirle a Magento que tome todos los productos en el almacén para seleccionar específicamente el nombre, y finalmente, ordenar los productos por el nombre.

La última línea, $coleccion->getSelect()->__toString(), permite que veamos la consulta real que Magento está ejecutando.

La consulta real que está siendo generada por Magento es:

SELECT `e`.*. IF( at_name.value_id >0, at_name.value, at_name_default. value ) AS `name

FROM `catalog_product_entity` AS `e`
LEFT JOIN `catalog_product_entity_varchar` AS `at_name_default` ON (`at_name_default`.`entity_id` = `e`.`entity_id`)
AND (`at_name_default`.`attribute_id` = '65')
AND `at_name_default`.`store_id` =0
LEFT JOIN `catalog_product_entity_varchar` AS `at_name` ON ( `at_name`.`entity_id` = `e`.`entity_id` )
AND (`at_name`.`attribute_id` = '65')
AND (`at_name`.`store_id` =1)
ORDER BY `name` ASC

Como podemos ver, los modelos ORM y  EAV son herramientas maravillosas ya que no sólo ponen un montón de potencia y flexibilidad en las manos de los desarrolladores, sino que también lo hacen de una manera que sea integral y fácil de utilizar.

 

Añadir nuevo comentario

CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.
7 + 6 =
Resuelva este simple problema matemático y escriba la solución; por ejemplo: Para 1+3, escriba 4.