Eu tenho um modelo personalizado e um modelo de recursos. Quero carregar uma única instância do modelo usando mais de 1 campo.
O modelo possui os seguintes campos:
id
tag_name
custom_name
group_name
Desejo carregar este modelo com base em tag_name, custom_name e group_name em vez de id.
Atualmente, estou usando uma coleção e addFilter para cada campo. Isso funciona, mas eu me perguntei se existe uma estratégia padrão para esse tipo de coisa no Magento.
EDITAR
O magento principal parece não usar coleções para esse cenário, mas usa consultas sql diretas nos modelos de recursos.
um exemplo disso é:
loadByAccountAndDate()
dentro Mage_Paypal_Model_Resource_Report_Settlement
Existe uma razão para isso, quando as coleções parecem ser uma maneira mais concisa, em termos de quantidade de código a ser gravado
Eu só não sei por que o magento escolhe fazer dessa maneira
fonte
_itemObjectClass
a mesma que o modelo realmente está chamandoloadByMultiple
. Portanto, como resultado, não$x = Mage::getModel('some/model')
seria uma instância de um modelo e$x->loadByMultiple($tag, $customName, $group)
realmente seria uma instância nova / diferente?loadByAttribute
. Veja esta pergunta para referência: magento.stackexchange.com/q/5926/146Módulo / Modelo / SomeModel.php
Módulo / Modelo / Recurso / SomeModel.php:
E, finalmente, você pode carregar o seguinte modelo:
Atualizada
A propósito, você pode usar esse método (loadByAttributes) facilmente, em vez de coletar e é mais compreensível. O Magento também despacha alguns eventos ao carregar a coleção ou entidade e a extensão de terceiros pode atualizar a coleção ou entidade pelo observador. Se você carregar a entidade por meio do recurso (dado no meu e no seu), nenhum evento / observador será acionado e você poderá obter a entidade "limpa" mais rapidamente, em vez de coletar. Além disso, o Magento não usa a coleção em cache dessa maneira, ele a carrega diretamente da tabela db.
Talvez seja por isso que use este método pelos módulos principais do Magento.
fonte
$this->setData($this->getResource()->loadByAttributes($attributes));
que deve ser:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
Certo?Você está fazendo certo com
addFilter
. No Magento, você pode carregar por qualquer atributo, mas não por vários atributos ao mesmo tempo. Ao adicionar filtros, você obtém o mesmo efeito sem sobrecarga extra.fonte
addFilter
está fazendo? :-)Em primeiro lugar - sua estratégia para filtrar uma coleção está correta. Como as coleções no Magento lazy-load, você tem a capacidade de criar métodos no seu modelo de recursos para definir com mais rigor os requisitos de sua carga personalizada.
Sem um pouco do seu código para amostra, considere o seguinte pseudo-método no seu Modelo de Recursos:
fonte