/entity-generator

Database-first Doctrine entity generator with oneToMany and manyToOne support

Primary LanguagePHPMIT LicenseMIT

Entity Generator

The Doctrine Project will be removing support for generating entities in Doctrine 3.

Not all development workflows will fit the proposed entity-first database management strategy.

To keep supporting a database-first workflow this project implements an alternative database oriented entity generator.

Features

  • Generate entities with type annotations, getters, setters, adders and removers;
  • Supports oneToMany and manyToOne relationships, including pluralization of properties and methods.

License

This project is licensed MIT and can be used for free in any personal or commercial project.

Usage

bin/entity-generator entity-generator:generate

Options

  • dsn Accepts the same format as Doctrine, so the value configured in .env can be used
  • namespace Namespace for the generated entities (Default App\Entity)
  • directory Output directory for the generated entities (Default src/Entity)
  • collection-interface Interface name for the collection type to use in the generated entities (Default \Doctrine\Common\Collections\Collection)
  • collection-implementation (Default \Doctrine\Common\Collections\ArrayCollection)

Using a DSN from a .env file

source .env
bin/entity-generator entity-generator:generate --dsn $DATABASE_URL

Implementation

  • A mapping is generated from an existing database using SHOW CREATE TABLE.
  • Entity classes are rendered using a Twig template.

Limitations

  • Only provides a \PDO based driver and an mapper for MySQL-like sql dialects.
  • Annotations for (unique) indexes are not (yet) implemented
  • ManyToMany relations are not (yet) supported (motivation)
  • Doctrine Custom types are not supported

Open issues

  • Naming conflicts on xyx_id with a foreign key and field xyx (both become xyz)
  • Naming conflicts on multiple foreign keys from one table to another (xyz.abc_1_id and xyz.abc_2_id both become xyz.abcs)
  • Blobs are not yet implemented