О модели коллекции и модели ресурсов


29

Я немного запутался в использовании модели ресурсов и модели коллекций. Иногда, когда я вижу примеры загрузки продуктов с использованием определенных атрибутов, в некоторых примерах они используют модель сбора, а иногда они используют модель ресурсов.

Также, когда я могу использовать определенный метод 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()...


Чтобы быть ясным - $productв вашем примере это пример Mage_Catalog_Model_Product, который является «моделью» на языке Magento.
отметки

Да, верно. но я запутался, когда использовать модель коллекции и модель ресурсов и какие методы доступны для использования. Как я вижу, модели коллекций доступны в папке Model >> collection модуля, а ресурсы доступны в модели ресурсов, но когда и какую модель нужно использовать, так что я немного запутался в этом
MagentoBoy

Я знаю, что нам нужно использовать доступные методы, которые доступны как в коллекциях, так и на аутсорсинге. Но мне трудно найти, чтобы использовать правильную модель. И я также не могу получить результат из набора результатов, используя методы «Get», значит getName (), используя имя строки таблицы базы данных. Это показывает неопределенный метод в объекте означает, что я обращаюсь к неправильной модели или методу, который мне нужно использовать, поэтому я не согласен с тем, что мне нужно использовать.
MagentoBoy

1
Спасибо, что задали этот вопрос ..
Я

Ответы:


63

Модели CRUD Magento имеют три основных типа классов.

«Модель» - это то, что вы будете использовать чаще всего. Это представляет данные определенного типа независимо от базы данных (продукт, категория, страница CMS, обзор и т. Д.)

«Модель ресурсов» - это класс, который за кулисами осуществляет фактическую выборку данных из Magento. Каждая модель имеет модель ресурсов, которая используется для загрузки одного экземпляра модели из базы данных.

«Коллекция» - это класс, который загружает массив, подобный структуре нескольких моделей, на основе набора правил. Думайте об этом как о SQL WHERE clause.

Несколько запутывает то, что за кулисами Magento также считает коллекцию моделью ресурсов. Итак, есть модели ресурсов коллекции и модели отдельных ресурсов .

Вообще говоря, когда вы хотите загрузить определенный элемент, вы используете модель . Когда вы хотите загрузить несколько элементов, вы используете модель ресурсов коллекции .

//loads one
$product = Mage::getModel('catalog/product')->load($id);

//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));

foreach($products as $product)
{
    var_dump($product->getSku());
}

При загрузке с помощью модели ресурсов коллекции следует иметь в виду, что afterLoad метод каждой отдельной модели не будет вызываться автоматически, что означает, что некоторые данные могут не загружаться.

К классам модели ресурсов для индивидуумов обычно нет прямого доступа. Тем не менее, иногда конкретная модель будет иметь модель ресурсов с полезным методом. Это вы обнаружите со временем, используя систему.

Наконец, еще одно различие. Обычные модели CRUD Magento имеют специальный синтаксис для загрузки через что-то, что не является числовым идентификатором. Например, вот как загрузить модель страницы CMS по заголовку

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

Тем не менее, несколько моделей Magento являются моделями EAV. Это означает «значение атрибута сущности» и является причудливым способом сказать, что эти модели не имеют фиксированного набора полей. Это включает в себя модели продуктов и моделей категорий. Эта функция позволяет выбирать различные атрибуты для разных типов продуктов. Каждое поле в модели EAV называется атрибутом. Приведенный выше синтаксис не будет работать с этими моделями, вместо этого вам нужно использовать loadByAttributeметод.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');

Что касается вашей конкретной проблемы, если вы получаете сообщение об ошибке с определенным текстом «метод неопределен», значит, что-то не так с вашей системой. Даже если getSkuметод не существует, в Magento есть магические методы установки и получения, которые гарантируют, что getвызов любой модели всегда будет возвращать что-то, даже если он нулевой.

Что более вероятно, вы получаете сообщение об ошибке, подобное следующему

Call to a member function getSku() on a non-object

Эта ошибка происходит, потому что loadByAttributeметод возвращает, falseесли он не может загрузить объект.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

Попробуйте что-то подобное в своем коде.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
    var_dump($product->getName());
    var_dump($product->getSku());
    var_dump($product->getData());
}
else
{
    var_dump("Could not load product");
}

В дополнение к условному, обратите внимание на getData()метод. Это вернет массив всех данных объекта в виде массива.

Надеюсь, этого достаточно, чтобы вы переехали. Удачи!


@ Алан .. Очень хорошее описание ... Я прочитал многие твои посты на Magento :) .. Я так счастлив, увидев твой ответ на мой пост. Я буду двигаться дальше с вашей информацией. Если у меня возникнут какие-либо проблемы, я надеюсь, что получу хорошую поддержку от этого сообщества. Поскольку я новичок в magento, а также в программировании, мой вопрос может быть не столько концептуальным, но все же я хочу учиться. Мне очень нравится magento framework :). Спасибо, сэр :)
MagentoBoy

Извините, у меня есть еще один вопрос. Если я позвоню $ product = Mage :: getModel ('catalog / product'); а затем, если я вызову getName () и getSku (). Могу ли я получить значения, если я повторяю $ product в foreachloop ?? или я должен вызвать метод loadByAttribute () ??
MagentoBoy

@MagentoBoy Мои извинения, но языковой барьер, кажется, маскирует ваш вопрос. Я не уверен, что вы спрашиваете.
Алан Шторм

сэр, извините. В волнении я не четко выразил свой вопрос. Но я попытался, и теперь я могу получить списки продуктов и, как теперь, могу правильно выбирать продукты, используя другой атрибут. :) и да, мой вопрос был, могу ли я использовать методы get, такие как getName (), getPrice (), getSku (), без вызова addAttributeToSelect ('*'), addAttributeToFilter () или loadByAttribute (); например $ product = Mage :: getModel ('каталог / продукт'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Поскольку модель get создает экземпляр класса продукта, тогда мы можем получить доступ к методам доступа get и set ,
MagentoBoy

1
@ user8009 Это сообщение об ошибке может произойти по бесчисленным причинам. Если вы не можете получить доступ по FTP или воспроизвести проблему в локальной / разрабатываемой версии системы, вы никогда не решите проблему.
Алан Шторм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.