我需要在Symfony Entities中创建这个数据库方案:
ClassA的:
ClassB的:
ClassC:
课程:
我需要在Course Entity(使用class_id)和其他实体(ClassA,ClassB,ClassC)(使用id)和使用class_type(A,B,C)之间创建关系。
课程不是课程,课程不是课程。这里没有继承权。在我的项目中,我正在使用这个概念(id和类型来映射不同的实体)。所以我需要通过一个像这样的简单例子来解决这个问题
我想过在这里使用@ORM \ DiscriminationMap:
/**
* Course
*
* @ORM\Table(name="Course")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="course_type", type="string")
* @ORM\DiscriminatorMap({"A" = "ClassA", "B" = "ClassB", "C" = "ClassC"})
*/
abstract class Course
{
//...
}
class ClassA extends Course
{
//...
}
class ClassB extends Course
{
//...
}
class ClassC extends Course
{
//...
}
或类似的东西。
但我不想在ClassA,ClassB,ClassC实体中复制Course的属性,因为“extends”会将父实体的属性复制到子级。
这不是关于遗产。我需要保留上述数据库方案,而不从其他实体添加任何其他属性。
谢谢
答案 0 :(得分:3)
解决方案可能是下一个:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="class")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string", length=20)
* @ORM\MappedSuperclass
* @ORM\DiscriminatorMap({
* "class_a" = "ClassA",
* "class_b" = "ClassB",
* "class_c" = "ClassC"
* })
*/
abstract class AbstractClass
{
... common fields
/**
* @var PersistentCollection
*
* @ORM\OneToMany(targetEntity="Course", cascade={"persist"}, mappedBy="course")
*/
protected $courses;
}
/**
* @Entity
* @ORM\Table(name="class_a")
*/
class ClassA extends AbstractClass
{
//...
}
/**
* @Entity
* @ORM\Table(name="class_b")
*/
class ClassB extends AbstractClass
{
//...
}
/**
* @Entity
* @ORM\Table(name="class_c")
*/
class ClassC extends AbstractClass
{
//...
}
/**
* @Entity
* @ORM\Table(name="course")
*/
class Course
{
/**
* @var AbstractClass
* @ORM\ManyToOne(targetEntity="AbstractClass", inversedBy="course")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
private $course;
....
}
所以现在你的classes
所有course
与{{1}}有一对多关系的单表(这只是一个例子,你可以使用一对多或多对多,取决于你的需要)。
在DQL中,您可以找到与INSTANCE OF一起使用的类。