Acerca del modelo de colección y el modelo de recurso

29

Estoy un poco confundido sobre el uso del modelo de recursos y el modelo de colección. A veces, cuando veo ejemplos para cargar productos usando atributos específicos, en algunos ejemplos, usan el modelo de colección y, a veces, usan el modelo de recursos.

Además, ¿cuándo puedo usar un método específico get...y set...junto con el nombre de la fila de la tabla? Al igual getName, getId. Traté de usar pero no pude obtener los valores y muestra un error: "llamando al método indefinido en el objeto"

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

Muestra "método indefinido getSku()"

Si lo uso var_dump($product), SKU se muestra en el objeto, sin embargo, no puedo obtener el SKU usando getSku()...

MagentoBoy
fuente
Para ser claros, $producten su ejemplo es una instancia de Mage_Catalog_Model_Product, que es un "modelo" en el lenguaje de Magento.
Benmarks
Si claro. pero estoy confundido sobre cuándo usar el modelo de colección y el modelo de recursos y qué métodos están disponibles para usar. Como veo, los modelos de colección están disponibles en Modelo >> carpeta de colección del módulo y los recursos están disponibles en el modelo de recursos, pero cuándo y qué modelo necesitan usar, así que me confundí un poco
MagentoBoy
Lo sé, necesitamos usar los métodos disponibles que están disponibles en la colección y subcontratar también. Pero tengo dificultades para encontrar el uso del modelo correcto. Y tampoco puedo obtener el resultado del conjunto de resultados usando métodos "Get" significa getName () usando el nombre de fila de la tabla de base de datos. Muestra un método indefinido en el objeto, lo que significa que estoy accediendo a un modelo o método incorrecto que necesito usar, por lo que no estoy convencido de cuál debo usar.
MagentoBoy
1
Gracias por hacer esta pregunta ...
Estuve

Respuestas:

63

Los modelos CRUD de Magento tienen tres tipos de clase básicos.

Un "modelo" es lo que usará más comúnmente. Esto representa datos de un tipo particular en una forma independiente de la base de datos (producto, categoría, página CMS, revisión, etc.)

Un "modelo de recursos" es una clase que, detrás de escena, realiza la obtención real de datos de Magento. Cada modelo tiene un modelo de recurso que se usa para cargar una sola instancia de un modelo desde la base de datos.

Una "colección" es una clase que carga una estructura tipo matriz de múltiples modelos basados ​​en un conjunto de reglas. Piense en ello como un SQL WHERE clause.

Un poco confuso es que, detrás de escena, Magento también considera que una colección es un modelo de recursos. Así que hay modelos de recursos de colección y modelos de recursos individuales .

En términos generales, cuando desea cargar un artículo específico, utiliza un modelo . Cuando desea cargar una cantidad de elementos, utiliza un modelo de recurso de recopilación .

//loads one
$product = Mage::getModel('catalog/product')->load($id);

//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));

foreach($products as $product)
{
    var_dump($product->getSku());
}

Una cosa a tener en cuenta sobre la carga a través de un modelo de recurso de recopilación es que el afterLoad método de cada modelo individual no se llamará automáticamente, lo que significa que algunos datos pueden no cargarse.

Los modelos de recursos individua clases por lo general no se puede acceder directamente. Sin embargo, ocasionalmente un modelo específico tendrá un modelo de recurso con un método útil. Estos los descubrirá con el tiempo utilizando el sistema.

Finalmente, hay una distinción más que hacer. Los modelos CRUD regulares de Magento tienen una sintaxis especial para cargar a través de algo que no es la identificación numérica. Por ejemplo, aquí se explica cómo cargar un modelo de página CMS por título

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

Sin embargo, algunos modelos de Magento son modelos EAV. Eso significa "valor de atributo de entidad", y es una forma elegante de decir que estos modelos no tienen un conjunto fijo de campos. Esto incluye modelos de productos y modelos de categoría. Esta característica es lo que le permite elegir diferentes atributos para diferentes tipos de productos. Cada campo en un modelo EAV se conoce como un atributo. La sintaxis anterior no funcionará con estos modelos, sino que debe usar el loadByAttributemétodo.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');

Con respecto a su problema específico, si obtiene un error con el texto específico "método indefinido", entonces algo está muy mal en su sistema. Incluso si el getSkumétodo no existe, Magento tiene métodos mágicos de establecimiento y obtención que aseguran que una getllamada en cualquier modelo siempre devolverá algo, incluso si es nulo.

Lo más probable es que recibas un error como el siguiente

Call to a member function getSku() on a non-object

Este error ocurre porque el loadByAttributemétodo regresa falsesi no puede cargar el objeto.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

Pruebe algo como esto en su código.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
    var_dump($product->getName());
    var_dump($product->getSku());
    var_dump($product->getData());
}
else
{
    var_dump("Could not load product");
}

Además del condicional, observe el getData()método. Esto devolverá una matriz de todos los datos del objeto como una matriz.

Esperemos que esto sea suficiente para que te muevas. ¡Buena suerte!

Alan Storm
fuente
@Alan ... Muy buena descripción ... He leído muchas de tus publicaciones en Magento :) .. Estoy muy feliz después de ver tu respuesta a mi publicación. Avanzaré con su información. Si tengo algún problema, espero obtener un buen apoyo de esta comunidad. Como soy nuevo en magento y en pogramming, mi pregunta puede no ser tanto conceptual pero todavía quiero aprender. A mi me gusta mucho Magento marco :) .. Gracias señor :)
MagentoBoy
Lo siento, tengo una pregunta más. Si llamo $ product = Mage :: getModel ('catalog / product'); y luego si llamo a getName () y getSku (). ¿Puedo obtener los valores si itero el producto $ en foreachloop? o tengo que llamar al método loadByAttribute () ??
MagentoBoy
@MagentoBoy Mis disculpas, pero la barrera del idioma parece estar enmascarando tu pregunta. No estoy seguro de lo que estás preguntando.
Alan Storm
señor, lo siento Emocionado, no expresé mi pregunta con claridad. Pero lo intenté y ahora puedo obtener las listas de productos y ahora puedo obtener los productos utilizando diferentes atributos correctamente. :) y sí, mi pregunta era, ¿puedo usar métodos get como getName (), getPrice (), getSku (), sin llamar a addAttributeToSelect ('*'), addAttributeToFilter () o loadByAttribute (); por ej. $ product = Mage :: getModel ('catálogo / producto'); foreach ($ producto como $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Como el modelo get instanciará la clase de producto, entonces podemos acceder al método get y set de acceso .
MagentoBoy
1
@ user8009 Ese mensaje de error puede ocurrir por innumerables razones. Si no puede obtener acceso FTP o reproducir el problema en una versión local / de desarrollo del sistema, nunca resolverá el problema.
Alan Storm