Pregunta

Tengo un modelo personalizado y el modelo de recursos. Quiero cargar una única instancia de 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 el tag_name, custom_name y nombre_de_grupo 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 no parece colecciones de uso para este escenario, pero en su lugar utiliza las consultas SQL directas en los modelos de recursos.

Un ejemplo de esto es:

loadByAccountAndDate() en Mage_Paypal_Model_Resource_Report_Settlement

¿Hay una razón para esto, cuando colecciones parecen ser una forma más concisa, en términos de cantidad de código que ser escrito

Yo sé por qué simplemente no elige magento a hacerlo de esta manera

¿Fue útil?

Solución

creo que este es un enfoque bien. Tal vez usted necesita para crear un envoltorio en la clase del modelo por lo que evitar escribir la misma cosa una y otra vez.
Algo así como:

public function loadByMultiple($tag, $customName, $group){
    $collection = $this->getCollection()
            ->addFieldToFilter('tag_name', $tag)
            ->addFieldToFilter('custom_name', $customName)
            ->addFieldToFilter('group_name', $group);
    return $collection->getFirstItem();
}

Y usted puede cargar el artículo como éste en ningún otro lugar:

$model = Mage::getModel('model/class_here')->loadByMultiple($tag, $customName, $group);
if ($model->getId()){
   //the instance exists
}
else{
    //not found
}

Otros consejos

Módulo / modelo / SomeModel.php

public function loadByAttributes($attributes)
{
    $this->setData($this->getResource()->loadByAttributes($attributes));
    return $this;
}

Módulo / modelo / Recursos / SomeModel.php:

public function loadByAttributes($attributes)
    {
        $adapter = $this->_getReadAdapter();
        $where   = array();
        foreach ($attributes as $attributeCode=> $value) {
            $where[] = sprintf('%s=:%s', $attributeCode, $attributeCode);
        }
        $select = $adapter->select()
            ->from($this->getMainTable())
            ->where(implode(' AND ', $where));

        $binds = $attributes;

        return $adapter->fetchRow($select, $binds);
    }

Y finalmente se puede cargar el modelo siguiente:

$attributes = array('tag_name'=> 'any', 'custome_name'=> 'some','group_name'=>'some');
$model      = Mage::getModel('module/somemodel')->loadByAttributes($attributes);

Actualización

Por el camino se puede utilizar este método (loadByAttributes) fácilmente en lugar de recogida y es más comprensible. Magento también distribuye algunos eventos mientras que la recolección de carga o entidad y extensión de terceros pueden actualizar colección o entidad por el observador. Si se carga a través de la entidad de recursos (dada en el ejemplo de la mía y la suya) ningún evento / observadores de fuego y se puede obtener entidad "limpia" más rápido en lugar de recogida. También Magento no consiste en la recopilación en caché de esta manera, se carga directamente desde la tabla db.
Tal vez la razón de utilizar este método de módulos básicos de Magento.

Se están haciendo las cosas bien con addFilter. En Magento puede cargar por cualquier atributo, pero no múltiples atributos a la vez. Mediante la adición de filtros a lograr el mismo efecto con una carga extra.

En primer lugar - su estrategia para filtrar una colección es correcta. Debido a que las colecciones en Magento perezoso-carga que tienen la capacidad de crear métodos en el modelo de recursos a más estrechamente definir los requisitos de su carga personalizado.

Sin algunos de su código de muestra, considere lo siguiente pseudo-método en su modelo de recursos:

<?php


class Marty_Wallace_Model_Resource_Method extends Mage_Core_Model_Resource_Db_Abstract{

    protected function _construct()
    {
        $this->_init('yourmodel/table', 'entity_id');
    }

    public function loadByCriteria(array $filter)
    {

        //$filter should be array('columnname'=>'value','columname'=>'value')

        $collection = Mage::getModel('yourmodel/class')->getCollection();

        foreach($filter as $column=>$value){
            $collection->addFieldToFilter($column,$value);
        }

        return $collection;

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top