Про модель колекції та модель ресурсу


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 парламенті.
орієнтири

Так правильно. але я плутаюся, коли використовувати модель колекції та модель ресурсів та які методи доступні для використання. Як я бачу, моделі колекції доступні в папці Модель >> колекції модуля, і ресурси доступні у моделі ресурсів, але коли і яку модель потрібно використовувати, тому я трохи заплутався в цьому
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()метод. Це поверне масив усіх даних об'єкта у вигляді масиву.

Сподіваємось, цього достатньо, щоб ви рухалися. Удачі!


@Alan .. Дуже приємний опис ... Я прочитав багато ваших публікацій на Magento :) .. Я так радий, побачивши вашу відповідь на мій пост. Я просунусь з вашою інформацією. Якщо я отримаю будь-яке питання, то сподіваюся, що я отримаю гарну підтримку від цієї громади. Оскільки я новачок у магенто, а також програмуванні, то моя запитання може бути не стільки концептуальною, але все ж я хочу навчитися. Я дуже люблю рамки magento багато :) Дякую, сер :)
MagentoBoy

Вибачте, у мене є ще одне питання. Якщо я називаю $ product = Mage :: getModel ('каталог / продукт'); і тоді, якщо я дзвоню getName () і getSku (). Чи можу я отримати значення, якщо я повторюю $ продукт у foreachloop ?? або я повинен викликати метод loadByAttribute () ??
MagentoBoy

@MagentoBoy Вибачте, але мовний бар'єр маскує ваше запитання. Я не впевнений, що ви просите.
Алан Шторм

сер, мені шкода. В хвилюванні я не висловив своє запитання чітко. Але я спробував, і тепер я маю змогу отримати списки продуктів і, як зараз, зможу отримати продукти, використовуючи інший атрибут належним чином. :) і так, моє запитання полягало в тому, чи можу я використовувати такі методи, як getName (), getPrice (), getSku (), не викликаючи addAttributeToSelect ('*'), addAttributeToFilter () або loadByAttribute (); для екс. $ product = Mage :: getModel ('каталог / товар'); foreach ($ продукт як $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Оскільки модель get інстанціює клас продукту, то ми можемо отримати доступ до методів отримання доступу та встановлення .
MagentoBoy

1
@ user8009 Це повідомлення про помилку може траплятися з безлічі причин. Якщо ви не можете отримати доступ до FTP або відтворити проблему в локальній / розробній версії системи, ви ніколи не вирішите проблему.
Алан Шторм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.