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;
// ...
}
我们还需要为Person和Employee实体分别创建其对应的数据库表:
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。需要注意的是,在使用继承策略时,我们需要明确表达出数据之间的关系,以确保查询正常进行。
极客教程