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 🙂
2 comments
Thanks for the comment. We have just taken the idea from the Shopware tutorial. We have not copied exactly. If you have any queries or suggestions then please send us an email at [email protected]