У меня есть пользовательская модель и модель ресурса. Я хочу загрузить один экземпляр модели, используя более 1 поля.
Модель имеет следующие поля:
id
tag_name
custom_name
group_name
Я хочу загрузить эту модель, основанную на tag_name, custom_name и group_name вместо id.
В настоящее время я использую коллекцию и addFilter для каждого поля. Это работает, но я задавался вопросом, есть ли стандартная стратегия для такого типа вещей в Magento?
РЕДАКТИРОВАТЬ
Кажется, ядро magento не использует коллекции для этого сценария, а вместо этого использует прямые sql-запросы в моделях ресурсов.
Примером этого является:
loadByAccountAndDate()
в Mage_Paypal_Model_Resource_Report_Settlement
Есть ли причина для этого, когда коллекции кажутся более краткими с точки зрения количества кода, который будет написан
Я просто не знаю, почему Мадженто решил сделать это таким образом
источник
_itemObjectClass
то же самое, что и модель, которая фактически вызываетloadByMultiple
. Таким образом, в результате, не$x = Mage::getModel('some/model')
будет ли один экземпляр модели и$x->loadByMultiple($tag, $customName, $group)
фактически будет другой / новый экземпляр?loadByAttribute
. См. Этот вопрос для справки: magento.stackexchange.com/q/5926/146Модуль / Модель / SomeModel.php
Модуль / Модель / Resource / SomeModel.php:
И, наконец, вы можете загрузить следующую модель:
обновленный
Кстати, вы можете использовать этот метод (loadByAttributes) проще, чем коллекцию, и это более понятно. Magento также отправляет некоторые события во время загрузки коллекции или объекта, и стороннее расширение может обновлять коллекцию или объект наблюдателем. Если вы загружаете сущность через ресурс (указанный в моем и вашем примере), никакие события / наблюдатели не запускаются, и вы можете получить «чистую» сущность быстрее, чем сбор. Также Magento не использует кэшированную коллекцию таким образом, она загружает ее непосредственно из таблицы БД.
Возможно, это причина использования этого метода базовыми модулями Magento.
источник
$this->setData($this->getResource()->loadByAttributes($attributes));
который должен быть:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
Верно?Вы делаете это правильно с
addFilter
. В Magento вы можете загрузить любой атрибут, но не несколько атрибутов одновременно. Добавляя фильтры, вы получаете тот же эффект без лишних затрат.источник
addFilter
делает? :-)Во-первых, ваша стратегия фильтрации коллекции верна. Поскольку коллекции в Magento lazy-load, у вас есть возможность создавать методы в вашей модели ресурсов, чтобы более точно определить требования вашей пользовательской нагрузки.
Без использования вашего кода для примера рассмотрим следующий псевдо-метод в вашей модели ресурсов:
источник