У розділі попередня стаття ви дізналися, як створювати нові таблиці в базі даних 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.