与学说Symfony的条件关系

时间:2017-07-01 16:03:45

标签: php database symfony orm doctrine

我需要在Symfony Entities中创建这个数据库方案:

ClassA的:

  • ID
  • 名称
  • ......仅适用于A类的其他一些属性

ClassB的:

  • ID
  • 名称
  • ......仅适用于B类的其他一些属性

ClassC:

  • ID
  • 名称
  • ...仅适用于C类的其他一些属性

课程:

  • ID
  • 名称
  • 类标识码
  • class_type [A,B,C]
  • ...

我需要在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”会将父实体的属性复制到子级。

这不是关于遗产。我需要保留上述数据库方案,而不从其他实体添加任何其他属性。

谢谢

1 个答案:

答案 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一起使用的类。