camelot/doctrine-inheritance-mapping

v2.0.2 2019-12-04 06:24 UTC

This package is auto-updated.

Last update: 2024-09-11 20:37:02 UTC


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
{
    // ...
}