У розділі попередня стаття ви дізналися, як створювати нові таблиці в базі даних Magento 2. У цьому розділі ви дізнаєтеся більше про моделі, що використовуються для роботи з базою даних Magento 2, що дозволяє читати, редагувати та видаляти дані.
Magento 2 та Magento 1 використовують ORM Model/ResourceModel/Collection ( Об'єктно-реляційне відображення ) для цих цілей. Щоб реалізувати цю концепцію, вам потрібно створити 3 файли (model, resource model, collection).
1. Створіть файл моделі:
app/code/VendorName/ModuleName/Model/Somemodel.php
додайте до нього наступний код:
<?php
namespace VendorName\ModuleName\Model;
class Somemodel extends \Magento\Framework\Model\AbstractModel
{
protected function _construct()
{
$this->_init('VendorName\ModuleName\Model\ResourceModel\Somemodel');
}
}
Конструкція _ініціалізує модель ресурсу. Передайте назву класу моделі ресурсу (створіть його на наступному кроці) методу _init . Найчастіше ви будете працювати з
Model . Цей клас має бути успадкований від \Magento\Framework\Model\AbstractModel або його дочірніх моделей. Він відповідає за роботу з одним записом у таблиці. Найчастіше використовувані методи в цьому класі:
Методи завантаження:
load($id) - loads an entry whose primary key equals $id;
load($value, $columnName) - loads an entry whose column value $columnName equals $value;
Методи отримання та встановлення:
getSomeKey() - gets the value for the property (column) some_key;
getData('some_key') - analog of getSomeKey;
setSomeKey($value) - sets the value for the property (column) some_key;
setData('some_key', $value) - analog of setSomeKey;
getId() - gets the value of the primary key;
setId($id) - set the value of the primary key;
Методи збереження та видалення:
save() - saves data to the database. If the primary key is not specified, creates a new entry;
delete() - deletes an entry whose key matches the key of the model object;
Інші методи:
getCollection() - returns the collection object;
getResource() - returns the resource model object;
Ви можете дізнатися про додаткові методи, дослідивши такі класи:
\Magento\Framework\Model\AbstractModel
\Magento\Framework\DataObject
2. Створіть клас Модель ресурсів:
app/code/VendorName/ModuleName/Model/ResourceModel/Somemodel.php
додайте до нього наступний код:
<?php
namespace VendorName\ModuleName\Model\ResourceModel;
class Somemodel extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
protected function _construct()
{ $this->_init('table_name_without_prefix', 'primary_column_name'); }
}
table_name_without_prefix - ім'я таблиці в базі даних Magento 2 без префікса;
primary_column_name - ім'я поля в цій таблиці з первинним ключем та автоінкрементом.
Методи завантаження та збереження у моделі працюють з базою даних через модель ресурсів .
3. Створення файлу колекції:
app/code/VendorName/ModuleName/Model/ResourceModel/Somemodel/Collection.php
додайте до нього наступний код:
<?php
namespace VendorName\ModuleName\Model\ResourceModel\Somemodel;
class Collection
extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
protected function _construct()
{ parent::_construct();
$this->_init(
'VendorName\ModuleName\Model\Somemodel',
'VendorName\ModuleName\Model\ResourceModel\Somemodel'
); }
}
Ви повинні передати імена класів моделі та ресурсів до _init . Найчастіше ви будете працювати з
. Колекція відповідає за завантаження кількох записів з таблиці. Найчастіше використовувані методи в цьому класі:
addFieldToFilter($field, $condition) - adds "WHERE $ field = $ condition" constraint;
addFieldToSelect($field) - defines which columns to include in the query. By default, all columns are included in the query;
setOrder($field, $direction) - indicates "ORDER BY $ field $ direction" sorting;
setPageSize($size) - indicates the "LIMIT $ size" restriction;
setCurPage($page) - sets the page number;
Дізнайтеся про інші методи, дослідивши такі класи:
\Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
\Magento\Framework\Data\Collection\AbstractDb
\Magento\Framework\Data\Collection
Приклад роботи з колекцією:
$collection = $this->collectionFactory->create();
$collection->addFieldToFilter('status', 1)
->addFieldToFilter('publish_date', ['lteq' => '2017-11-01'])
->setPageSize(10);
foreach ($collection as $item) {
echo $item->getName();
}
Цей код виконує запити до бази даних та отримує перші 10 записів, у яких стовпець status дорівнює 1, а publish_date менше або дорівнює 2017-11-01. Потім цей код відображає значення стовпця 'name' для кожного отриманого запису в циклі.
У прикладах ми розробляємо модуль для поширених запитань. Ви можете переглянути змінений код на GitHub.