加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Doctrine 2具有关联的具体表继承

发布时间:2020-12-13 16:22:46 所属栏目:PHP教程 来源:网络整理
导读:我已经阅读了 Doctrine 2 Inheritance Mapping with Association,但是如果你需要Animal本身就是一个实体,比如创建选项列表. 在这种情况下,Pet的Discriminator Column位于动物表的种类列中. 所以这些类就是这样的. class Animal{ $id; $species;}/** * @Table
我已经阅读了 Doctrine 2 Inheritance Mapping with Association,但是如果你需要Animal本身就是一个实体,比如创建选项列表.

在这种情况下,Pet的Discriminator Column位于动物表的种类列中.

所以这些类就是这样的.

class Animal
{
    $id;
    $species;
}

/**
 * @Table(name="animal")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="species",type="string")
 * @DiscriminatorMap({"dog" = "Dog","cat" = "Cat"})
 */
abstract class Pet
{
    $id
    $species;
}

class Dog extends Pet { }

class Cat extends Pet { }

class Owner 
{
    /**
     * @OneToMany(targetEntity="Pet")
     */
    $pets
}

我看到了几个问题.

>动物表没有所有者的外键.所以
$pets association不起作用.
>动物和宠物或多或少都是一样的东西.如果有的话
在动物中改变一些东西,这些改变不会反映出来
任何Pet子类.

对第一个问题的一个可能的解决方案是有一个名为pet的额外表,但是关联仍然存在问题,因为鉴别器列仍在动物表中并且重复宠物中的列会破坏规范化.

解决方法

我不确定完全理解你的问题,但我会试一试:

> Pet是一个动物,在你的类层次结构中明确它是有意义的.请注意,抽象类Pet可以子类化具体类Animal.这样,您仍然可以实例化动物,狗或猫,但您无法实例化宠物;
> Animal root类可以有自己的鉴别器值,这样可以使用Doctrine持久化它.然后,您可以创建并持久化狗或猫,甚至是通用动物;
>动物需要参考其拥有者;
>所有者现在与Animal有一对多的关系;
>种类列是一个鉴别器,并且没有为您的域模型添加任何值(类名称将告诉您正在处理哪个Animal),因此我建议删除此属性.

最后说明,你真的需要一个Pet课吗?如果一个宠物没有任何特定的动物(即该类是空的),那么你应该从你的类层次结构中删除它.

class Owner {
    /**
     * @OneToMany(targetEntity="Animal")
     */
    protected $animals;
}

/**
 * @Table(name="animal")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="species",type="string")
 * @DiscriminatorMap({"animal" = "Animal","dog" = "Dog","cat" = "Cat"})
 */
class Animal {
    /** @Id @Column(type="integer") @GeneratedValue */
    protected $id;

    /** @ManyToOne(targetEntity="Owner") */
    protected $owner;
}

abstract class Pet extends Animal {
    // Do you really need this class?
}

class Dog extends Pet {
    // ...
}

class Cat extends Pet {
    // ...
}

关于您的数据库结构,我建议进行以下更改:

>从Dog&移动owner_id猫到动物桌;>从Dog&中删除animal_id猫表;他们将与Animal表(一对一)共享id值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读