gpt4 book ai didi

php - 在 Doctrine : curious database generation 中使用抽象子类

转载 作者:行者123 更新时间:2023-11-29 22:02:54 26 4
gpt4 key购买 nike

我目前正在使用 Doctrine2 开发 Symfony2/mySQL 项目。在我们的概念中,我们有一个“ super ”抽象类,它由抽象子类扩展,而抽象子类本身又由具体类扩展。

这是我的代码:

<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
* Description of SuperAbstractClass
*
* @author gbrugiere
* @ORM\Table(name="superabstractclass")
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string", length=2)
* @ORM\DiscriminatorMap({"AC" = "AbstractClass","C1" = "ConcreteClass1", "C2" = "ConcreteClass2"})
*/
abstract class SuperAbstractClass {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="label", type="text", nullable=false)
*/
protected $label;

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set libellé
*
* @param string $label
* @return SuperAbstractClass
*/
public function setLabel($label)
{
$this->label = $label;

return $this;
}

/**
* Get libellé
*
* @return string
*/
public function getLabel()
{
return $this->label;
}
}
?>

然后:

<?php

namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

/**
* Description of SuperAbstractClass
*
* @author gbrugiere
* @ORM\Table(name="abstractclass")
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string", length=2)
* @ORM\DiscriminatorMap({"C1" = "ConcreteClass1", "C2" = "ConcreteClass2"})
*/
abstract class AbstractClass extends SuperAbstractClass {

/**
* @var string
*
* @ORM\Column(name="souslibelle", type="text", nullable=false)
*/
protected $sousLibelle;

/**
* Set sous-libellé
*
* @param string $sousLibelle
* @return AbstractClass
*/
public function setSousLibelle($sousLibelle)
{
$this->sousLibelle = $sousLibelle;

return $this;
}

/**
* Get sous-libellé
*
* @return string
*/
public function getSousLibelle()
{
return $this->sousLibelle;
}
}
?>

这是我的最后一个代码:

<?php

namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

/**
* Description of ConcreteClass1
*
* @author gbrugiere
* @ORM\Table(name="concreteclass1")
* @ORM\Entity
*/
class ConcreteClass1 extends AbstractClass {

/**
* @var string
*
* @ORM\Column(name="details", type="text", nullable=false)
*/
private $details;

/**
* Set details
*
* @param string $details
* @return ConcreteClass1
*/
public function setDetails($details)
{
$this->details = $details;

return $this;
}

/**
* Get details
*
* @return string
*/
public function getDetails()
{
return $this->details;
}
}
?>

当我生成 SQL 代码时,我得到:

CREATE TABLE superabstractclass (id INT AUTO_INCREMENT NOT NULL, libelle LONGTEXT NOT NULL, discr VARCHAR(2) NOT NULL, PRIMARY KEY(id)) 
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE abstractclass (id INT NOT NULL, subLabel LONGTEXT NOT NULL, PRIMARY KEY(id))
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE concreteclass1 (id INT NOT NULL, details LONGTEXT NOT NULL, PRIMARY KEY(id))
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE concreteclass2 (id INT NOT NULL, detailsautres LONGTEXT NOT NULL, PRIMARY KEY(id))
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

ALTER TABLE abstractclass
ADD CONSTRAINT FK_438A1A85BF396750 FOREIGN KEY (id)
REFERENCES superabstractclass (id) ON DELETE CASCADE;

ALTER TABLE concreteclass1
ADD CONSTRAINT FK_474E75CFBF396750 FOREIGN KEY (id)
REFERENCES superabstractclass (id) ON DELETE CASCADE;

我对最后一行感到有点惊讶。为什么我的 concreteclass1 表引用 superabstractclass(请参阅 *FK_474E75CFBF396750*)而不是 abstractclass。我担心我的数据完整性:如果删除 abstractclass 行会发生什么。我仍然会有一个 superabstractclass 和一个 concreteclass1 行(表示对象实例),但我会丢失有关对象的一些信息。

我错过了什么吗?我已经搜索了几个小时,但没有找到任何东西。感谢您的帮助。

最佳答案

我推荐以下设置:

/**
* @ORM\MappedSuperclass
*/
abstract class SuperAbstractClass {...}

/**
* @ORM\MappedSuperclass
*/
abstract class AbstractClass extends SuperAbstractClass {...}

/**
* @ORM\Table(name="concreteclass1")
* @ORM\Entity
*/
class ConcreteClass1 extends AbstractClass {...}

这将在您的架构中仅创建一个表(名为creteclass1)并具有Concrete、Abstract 和SuperAbstractClass 的所有属性。您仍然可以使用通用功能(例如 id 生成将起作用)。

如果您有一个额外的 ConcreteClass,它将创建一个新的表/实体,然后再次继承您需要的任何内容。

我们也有这样的设置 - 根据我的理解,这里不需要有联合继承。

关于php - 在 Doctrine : curious database generation 中使用抽象子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32440815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com