MySQL如何无需Discriminator-Column扩展Doctrine-Entity

MySQL如何无需Discriminator-Column扩展Doctrine-Entity

在本文中,我们将探讨MySQL如何扩展Doctrine-Entity,而无需使用Discriminator-Column。

阅读更多:MySQL 教程

什么是Doctrine-Entity

Doctrine-Entity是Doctrine ORM的基础构建单元,它代表了实体类的真实映射。在Doctrine中,每个Entity都需要继承BaseEntity或其衍生类,并将类中的所有映射属性使用注解进行标记。例如:

<?php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 * @ORM\Table(name="person")
 */
class Person
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    privatename;

    /**
     * @ORM\Column(type="integer")
     */
    private $age;

    // ...
}

Doctrine-Entity扩展

通常,在某些情况下,我们需要为多个实体创建公共基类,以避免重复的代码。但是,从Doctrine-Entity创建公共基类需要注意一些问题,特别是在使用继承策略时,如果没有使用合适的解决方案,将可能导致查询出现问题。继承策略有3种类型:

  • Single Table Inheritance(单张表继承)
  • Class Table Inheritance(类表继承)
  • Concrete Table Inheritance(具体表继承)

我们来看一个例子,从Person实体创建基类BasePerson,并从BasePerson扩展一个Employee实体类:

<?php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 */
class BasePerson
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    privatename;

    /**
     * @ORM\Column(type="integer")
     */
    private age;

    // ...
}  

/**
 * @ORM\Entity(repositoryClass="App\Repository\EmployeeRepository")
 * @ORM\Table(name="employee")
 */
class Employee extends BasePerson
{
    /**
     * @ORM\Column(type="string", length=255)
     */
    privatejob_title;

    // ...
}

我们还需要为PersonEmployee实体分别创建其对应的数据库表:

CREATE TABLE person (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INT NOT NULL
);

CREATE TABLE employee (
    id INT PRIMARY KEY REFERENCES person(id),
    job_title VARCHAR(255) NOT NULL
);

这样我们就可以在数据库中保存Employee实体了,但是我们并没有使用Discriminator-Column来区分不同实体。相关的查询也需要注意,例如,我们需要查询Employee

SELECT * FROM person p JOIN employee e ON p.id = e.id;

总结

通过上述示例,我们可以看到如何扩展Doctrine-Entity,而无需使用Discriminator-Column。需要注意的是,在使用继承策略时,我们需要明确表达出数据之间的关系,以确保查询正常进行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程