Я немного запутался в использовании модели ресурсов и модели коллекций. Иногда, когда я вижу примеры загрузки продуктов с использованием определенных атрибутов, в некоторых примерах они используют модель сбора, а иногда они используют модель ресурсов.
Также, когда я могу использовать определенный метод get...
и set...
наряду с именем строки таблицы? Как getName
, getId
. Я пытался использовать, но не смог получить значения, и он показывает ошибку: «вызов неопределенного метода в объекте»
$product = Mage::getModel('catalog/product')
->loadByAttribute('name', 'product_name');
echo $product->getName();
echo $product->getSku();
Это показывает "неопределенный метод getSku()
"
Если я использую var_dump($product)
, SKU показывает в объекте, однако не может получить SKU, используя getSku()
...
magento-1.7
collection
product-list
resource-model
MagentoBoy
источник
источник
$product
в вашем примере это примерMage_Catalog_Model_Product
, который является «моделью» на языке Magento.Ответы:
Модели CRUD Magento имеют три основных типа классов.
«Модель» - это то, что вы будете использовать чаще всего. Это представляет данные определенного типа независимо от базы данных (продукт, категория, страница CMS, обзор и т. Д.)
«Модель ресурсов» - это класс, который за кулисами осуществляет фактическую выборку данных из Magento. Каждая модель имеет модель ресурсов, которая используется для загрузки одного экземпляра модели из базы данных.
«Коллекция» - это класс, который загружает массив, подобный структуре нескольких моделей, на основе набора правил. Думайте об этом как о SQL
WHERE clause
.Несколько запутывает то, что за кулисами Magento также считает коллекцию моделью ресурсов. Итак, есть модели ресурсов коллекции и модели отдельных ресурсов .
Вообще говоря, когда вы хотите загрузить определенный элемент, вы используете модель . Когда вы хотите загрузить несколько элементов, вы используете модель ресурсов коллекции .
При загрузке с помощью модели ресурсов коллекции следует иметь в виду, что
afterLoad
метод каждой отдельной модели не будет вызываться автоматически, что означает, что некоторые данные могут не загружаться.К классам модели ресурсов для индивидуумов обычно нет прямого доступа. Тем не менее, иногда конкретная модель будет иметь модель ресурсов с полезным методом. Это вы обнаружите со временем, используя систему.
Наконец, еще одно различие. Обычные модели CRUD Magento имеют специальный синтаксис для загрузки через что-то, что не является числовым идентификатором. Например, вот как загрузить модель страницы CMS по заголовку
Тем не менее, несколько моделей Magento являются моделями EAV. Это означает «значение атрибута сущности» и является причудливым способом сказать, что эти модели не имеют фиксированного набора полей. Это включает в себя модели продуктов и моделей категорий. Эта функция позволяет выбирать различные атрибуты для разных типов продуктов. Каждое поле в модели EAV называется атрибутом. Приведенный выше синтаксис не будет работать с этими моделями, вместо этого вам нужно использовать
loadByAttribute
метод.Что касается вашей конкретной проблемы, если вы получаете сообщение об ошибке с определенным текстом «метод неопределен», значит, что-то не так с вашей системой. Даже если
getSku
метод не существует, в Magento есть магические методы установки и получения, которые гарантируют, чтоget
вызов любой модели всегда будет возвращать что-то, даже если он нулевой.Что более вероятно, вы получаете сообщение об ошибке, подобное следующему
Эта ошибка происходит, потому что
loadByAttribute
метод возвращает,false
если он не может загрузить объект.Попробуйте что-то подобное в своем коде.
В дополнение к условному, обратите внимание на
getData()
метод. Это вернет массив всех данных объекта в виде массива.Надеюсь, этого достаточно, чтобы вы переехали. Удачи!
источник