How to Create CRUD Models in Magento 2
In Magento 2, CRUD operations are essential for creating, reading, updating, and deleting records in the database. Whether you’re developing a custom module or working on an extension, understanding how to implement CRUD operations is fundamental. In this guide, we’ll walk you through the process of creating a simple CRUD model for managing custom data in your Magento 2 store.
Step 1: Create a Custom Module
Before creating a CRUD model, we first need to create a custom module in Magento 2. Let’s call our module Mavenbird_CrudExample. To begin:
- Navigate to the app/code directory in your Magento 2 installation.
- Create a directory structure:
app/code/Mavenbird/CrudExample
.
Inside this folder, create the following files:
app/code/Mavenbird/CrudExample/registration.php app/code/Mavenbird/CrudExample/etc/module.xml
The registration.php file registers the module with Magento:
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Mavenbird_CrudExample', __DIR__ );
And the module.xml file contains the module’s configuration:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Mavenbird_CrudExample" setup_version="1.0.0" />
Once these files are in place, the module is registered. Next, we can proceed with creating the CRUD model.
Step 2: Create the Model
Now that the module is set up, we’ll create the model that will handle the data. For our example, let’s say we’re managing "items" in the system.
Create the model file Item.php in the app/code/Mavenbird/CrudExample/Model
directory:
<?php namespace Mavenbird\CrudExample\Model; use Magento\Framework\Model\AbstractModel; use Mavenbird\CrudExample\Model\ResourceModel\Item as ResourceModel; class Item extends AbstractModel { protected $_idFieldName = 'item_id'; // Primary key field protected $_name = 'name'; // Field name for the item name protected $_resourceModel = ResourceModel::class; // Reference to the resource model // Constructor method to initialize resource model protected function _construct() { $this->_init(\Mavenbird\CrudExample\Model\ResourceModel\Item::class); } // Getter method for item ID public function getId() { return $this->_getData($this->_idFieldName); } // Getter method for item name public function getName() { return $this->_getData($this->_name); } // Setter method for item name public function setName($name) { return $this->setData($this->_name, $name); } }
This model defines two fields: item_id and name. We’re using Magento's AbstractModel
as the base class, which provides methods for working with the database.
Step 3: Create the Resource Model
The resource model defines how the model interacts with the database table. Create the file Item.php in the app/code/Mavenbird/CrudExample/Model/ResourceModel
directory:
<?php namespace Mavenbird\CrudExample\Model\ResourceModel; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; class Item extends AbstractDb { // Initialize resource model with table name and primary key protected function _construct() { $this->_init('mavenbird_crudexample_item', 'item_id'); // Table name and primary key } }
In this resource model, the table name is mavenbird_crudexample_item (this table will need to exist in your database), and the primary key is item_id.
Step 4: Create the Collection Model
The collection model allows us to retrieve multiple records from the database. It extends the AbstractCollection
class. Create the file Collection.php in the app/code/Mavenbird/CrudExample/Model/ResourceModel/Item
directory:
<?php namespace Mavenbird\CrudExample\Model\ResourceModel\Item\Collection; use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; use Mavenbird\CrudExample\Model\Item as Model; use Mavenbird\CrudExample\Model\ResourceModel\Item as ResourceModel; class Collection extends AbstractCollection { // Define collection’s field names protected $_idFieldName = 'item_id'; protected $_nameFieldName = 'name'; protected $_itemClass = Model::class; protected $_resourceModel = ResourceModel::class; // Constructor method to initialize collection protected function _construct() { $this->_init(Model::class, ResourceModel::class); } }
The collection model allows you to fetch all items from the database and is crucial for operations like retrieving lists of records.
Step 5: Create the Controller
To demonstrate the CRUD operations, let’s create a simple controller that fetches and displays all items. Create a file Index.php inside app/code/Mavenbird/CrudExample/Controller/Index
:
<?php namespace Mavenbird\CrudExample\Controller\Index; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Mavenbird\CrudExample\Model\ResourceModel\Item\CollectionFactory; class Index extends Action { protected $collectionFactory; public function __construct(Context $context, CollectionFactory $collectionFactory) { parent::__construct($context); $this->collectionFactory = $collectionFactory; } // Fetch all items and display their names public function execute() { $collection = $this->collectionFactory->create(); foreach ($collection as $item) { echo $item->getName(); // Display the name of each item } } }
This controller fetches all items using the collection model and displays their names on the page. You can extend this functionality to handle Create, Update, and Delete actions as needed.
Step 6: Enable the Module
Once the code is in place, enable the module by running the following commands from the Magento root directory:
php bin/magento module:enable Mavenbird_CrudExample php bin/magento setup:upgrade php bin/magento cache:flush
After running these commands, your custom module is ready to use. You can test the controller by accessing http://your-magento-site.com/crudexample/index/index to see the list of items.
Conclusion
Creating CRUD models in Magento 2 is a critical skill for building custom modules. By following this guide, you’ve learned how to create models, resource models, collections, and controllers to manage data in your Magento store. At Mavenbird, we focus on making Magento development easier and more efficient. With a solid understanding of CRUD operations, you can extend your Magento store with custom functionalities and integrations. Happy coding!