How to create custom entity in Shopware6
Introduction
This article give you a brief introduction about how to create a custom entity in shopware6. Your plugin have to save you custom data into table for this approach we need to create entity.
Overview
If you want to create a custom entity then you need to create entity definition for your table. for this Shopware 6 uses data abstraction layer query for database.
Create Entity Definition
First of all we need to create EntityDefinition class, then create a customEntityDefinition.php file into directory <plugin root>/src/Core/Content/Bundle. In Entity definition define table name and define field collection. In field collection we also use association for the tables. For example create a custom entity definition below.
<?php declare(strict_types=1); namespace Webkul\CustomEntity\Custom; use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\PrimaryKey; use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required; use Shopware\Core\Framework\DataAbstractionLayer\Field\IdField; use Shopware\Core\Framework\DataAbstractionLayer\Field\StringField; use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection; class CustomEntityDefinition extends EntityDefinition { public const ENTITY_NAME = 'table_name'; public function getEntityName(): string { return self::ENTITY_NAME; } public function getCollectionClass(): string { return CustomEntityCollection::class; } public function getEntityClass(): string { return CustomEntity::class; } protected function defineFields(): FieldCollection { return new FieldCollection([ (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()), new StringField('field_name', 'fieldName'), ]); } }
There is no need to create CustomEntityClass and CustomEntityCollection file, it is your choice . because it has been done without creating entity class and entity collection.
Registering your entity definition
Register your custom entity definition into service, creating service.xml file under <plugin root>/src/Resources/config/ .Next you need to only register your custom entity definition class into service.xml file, so entity is register into DI container.
This is how your services.xml
could look like:
<?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="Webkul\Core\Content\Bundle\CustomEntityDefinition"> <tag name="shopware.entity.definition" entity="table_name" /> </service> </services> </container>
Creating the table
In addition to creating the database table, then create a new directory named src/Migration
in your plugin root and add a migration class. As well as creating Migration it will be create table into database on installing plugin or updating plugin.
<?php declare(strict_types=1); namespace Swag\CustomEntity\Migration; use Doctrine\DBAL\Connection; use Shopware\Core\Framework\Migration\MigrationStep; class Migration20072020Custom extends MigrationStep { public function getCreationTimestamp(): int { return 20072020; } public function update(Connection $connection): void { $sql = <<<SQL CREATE TABLE IF NOT EXISTS `custom_entity` ( `id` BINARY(16) NOT NULL, `field_name` VARCHAR(255) COLLATE utf8mb4_unicode_ci, `created_at` DATETIME(3) NOT NULL, `updated_at` DATETIME(3), PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; SQL; $connection->executeUpdate($sql); } }
Use of custom entity in your logic
As well as With help of the DI container you can get custom repository, and You can get your entity repository through container.
I hope it will help you. Thanks for reading 🙂