Tengo un modelo personalizado y un modelo de recursos. Quiero cargar una sola instancia del modelo usando más de 1 campo.
El modelo tiene los siguientes campos:
id
tag_name
custom_name
group_name
Quiero cargar este modelo basado en tag_name, custom_name y group_name en lugar de id.
Actualmente estoy usando una colección y addFilter para cada campo. Esto funciona, pero me preguntaba si hay una estrategia estándar para este tipo de cosas en Magento.
EDITAR
Core magento parece no usar colecciones para este escenario, sino que usa consultas sql directas en los modelos de recursos.
Un ejemplo de esto es:
loadByAccountAndDate()
en Mage_Paypal_Model_Resource_Report_Settlement
¿Hay alguna razón para esto, cuando las colecciones parecen ser una forma más concisa, en términos de la cantidad de código que se debe escribir?
Simplemente no sé por qué magento elige hacerlo de esta manera
fuente
_itemObjectClass
el mismo aspecto que el modelo que realmente llamaloadByMultiple
. Como resultado, ¿no$x = Mage::getModel('some/model')
sería una instancia de un modelo y en$x->loadByMultiple($tag, $customName, $group)
realidad sería una instancia diferente / nueva?loadByAttribute
. Consulte esta pregunta como referencia: magento.stackexchange.com/q/5926/146Módulo / Modelo / SomeModel.php
Módulo / Modelo / Recurso / SomeModel.php:
Y finalmente puede cargar el siguiente modelo:
Actualizado
Por cierto, puede usar este método (loadByAttributes) fácilmente en lugar de la colección y es más comprensible. Magento también despacha algunos eventos mientras carga la colección o entidad y la extensión de terceros puede actualizar la colección o entidad por observador. Si carga la entidad a través del recurso (dado en el mío y el suyo), no se dispara ningún evento / observador y puede obtener una entidad "limpia" más rápido que la recolección. Además, Magento no utiliza la colección en caché de esta manera, la carga directamente desde la tabla db.
Quizás esa sea la razón de usar este método en los módulos principales de Magento.
fuente
$this->setData($this->getResource()->loadByAttributes($attributes));
que debería ser:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
¿ verdad ?Lo estás haciendo bien con
addFilter
. En Magento puede cargar por cualquier atributo pero no por múltiples atributos a la vez. Al agregar filtros se logra el mismo efecto sin sobrecarga adicional.fuente
addFilter
está haciendo? :-)En primer lugar, su estrategia para filtrar una colección es correcta. Debido a que las colecciones en Magento lazy-load tiene la capacidad de crear métodos en su modelo de recursos para definir más estrictamente los requisitos de su carga personalizada.
Sin parte de su código para probar, considere el siguiente pseudo-método en su Modelo de recursos:
fuente