camelot / doctrine-inheritance-mapping
Doctrine 继承映射库
v2.0.2
2019-12-04 06:24 UTC
Requires
- php: ^7.4
- doctrine/annotations: ^1.7
- doctrine/orm: ^2.7
Requires (Dev)
- camelot/coding-style: ^2.0
- doctrine/doctrine-bundle: ^2.0
- friendsofphp/php-cs-fixer: ^2.16
- phpunit/phpunit: ^8.4
- ramsey/uuid-doctrine: ^1.5
- symfony/config: ^5.0
- symfony/debug-bundle: ^5.0
- symfony/framework-bundle: ^5.0
- symfony/http-kernel: ^5.0
- symfony/phpunit-bridge: ^5.0
- symfony/var-dumper: ^5.0
- symfony/yaml: ^5.0
README
注意:为支持旧版PHP(7.1+),请使用1.0分支。
安装
打开命令行界面,进入项目目录并执行
$ composer require camelot/doctrine-inheritance-mapping
此命令要求您全局安装Composer,如Composer文档中的安装章节所述。
独立配置
use Camelot\DoctrineInheritanceMapping\Annotation\DiscriminatorMapLoader; use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\DocParser; use Doctrine\ORM\Configuration; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\Driver\AnnotationDriver; // Annotation reader & driver $reader = new AnnotationReader(new DocParser()); $driver = new AnnotationDriver($reader); $driver->addPaths(['/path/to/entities']); // Doctrine configuration $config = new Configuration(); $config->setMetadataDriverImpl($driver); $classMetadata = new ClassMetadata(YourEntityName::class); $loader = new DiscriminatorMapLoader($reader, $config); $loader->loadClassMetadata($classMetadata);
框架配置
Symfony 扩展包
如果使用Symfony框架,可以通过将其添加到项目config/bundles.php
文件中注册的扩展包列表来启用此扩展包
// config/bundles.php return [ // ... Camelot\DoctrineInheritanceMapping\Bridge\Symfony\DoctrineInheritanceMappingBundle::class => ['all' => true], ];
用法
单表继承
@DiscriminatorMapItem
注解
Doctrine的单表继承是一种继承映射策略,其中层次结构中的所有类都映射到单个数据库表中。
映射通过一个“区分符”列处理,该列在父类的映射定义中定义。此列的值定义了要使用的实体类,基于继承层次结构。这将父类与子类绑定,并在过程中混合职责。
为了分离这些关注点,此库为层次结构中的每个实体提供了@DiscriminatorMapItem
注解,以替换父类对Doctrine的@DiscriminatorMap
的使用,从而消除了每次更新子类都需要更新父类的需求。
示例
父类
<?php namespace App\Entity; use Camelot\DoctrineInheritanceMapping\Annotation\DiscriminatorMapItem; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity() * @ORM\InheritanceType("SINGLE_TABLE") * @DiscriminatorMapItem(value="SingleTable") */ class SingleTable { // ... }
注意:使用@DiscriminatorColumn
与@DiscriminatorMapItem
是可选的,并且已在上文中省略以保持清晰。
子类
<?php namespace App\Entity; use Camelot\DoctrineInheritanceMapping\Annotation\DiscriminatorMapItem; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity() * @DiscriminatorMapItem(value="SingleTableChild") */ class SingleTableChild extends SingleTable { // ... }