Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony:转换扩展同一类的两个实体_Php_Symfony_Inheritance_Doctrine Orm - Fatal编程技术网

Php Symfony:转换扩展同一类的两个实体

Php Symfony:转换扩展同一类的两个实体,php,symfony,inheritance,doctrine-orm,Php,Symfony,Inheritance,Doctrine Orm,也许关于这个话题已经有了答案,但我找不到任何信息。如果已经有答案,只需发布任何链接 我的问题是: 我使用Symfony 2.5和doctrine 2 我的一个常见问题是,我有一个实体,我想持久化到数据库中的不同表中。为此,我通常创建一个超类,并将其扩展到两个具体的实体中,并将其持久化到数据库中 现在我有两个来自同一个基类的实体。有可能从一个转换到另一个吗。当然,我必须将它们分别保存到数据库中 一个例子。我有两个类:“quote”和“order”,它们基本上是相同的,并且扩展了超类“project

也许关于这个话题已经有了答案,但我找不到任何信息。如果已经有答案,只需发布任何链接

我的问题是:

我使用Symfony 2.5和doctrine 2

我的一个常见问题是,我有一个实体,我想持久化到数据库中的不同表中。为此,我通常创建一个超类,并将其扩展到两个具体的实体中,并将其持久化到数据库中

现在我有两个来自同一个基类的实体。有可能从一个转换到另一个吗。当然,我必须将它们分别保存到数据库中

一个例子。我有两个类:“quote”和“order”,它们基本上是相同的,并且扩展了超类“project”

现在,一旦确认报价,我想将其“转换”为订单,并保留所有基础数据(存储在“项目”部分)。我还想保留报价单本身,所以我有点想从报价单中创建一个新订单,而不是直接使用“项目”并在那里设置一个状态

当然,我可以编写一个构造函数或其他东西,但我正在寻找一种方法来克隆对象的这一部分

也许有另一种方法,不扩展类,但在类本身中使用“项目”部分。不确定,但在我看来,很多人可能已经遇到了这样的问题,对于这种情况可能有一个明智的解决方案


如果适用的话,我也很乐意提供指向文档的链接。

为什么不使用N到N映射而不是超类?然后你可以做一个
$order=neworder()$order->setProject($quote->getProject())。。。简单多了,现在你不会弄乱你的数据。想想看。虽然这意味着所有的“项目”都存储在同一个表中,但我尽量避免这样做。如果我以后需要修改某些内容,这将变得复杂。另外,我认为如果它们是分开的,直接查询数据库会更容易。也许我不得不过度考虑…使用类表继承而不是MappedSuperClass,然后,您可以通过简单地更改鉴别器值来进行转换,多亏了这个技巧,但我认为这基本上可以归结为相同的结果,只是现在对于超类项目和子类quote/order之间的关系没有额外的表,因为它存储在项目表本身中。我想要的是,我可以将相同的对象/实体存储在两个不同的表中,并在另一个方向创建一个对象,该对象可以作为其中一个或另一个的一部分。这与其说是一个解决方案,不如说是一个想法。也许我可以把复制部分放在超类的构造函数中。构造函数获取任何对象并检查它是否“是的子类”。如果是这样,则可以获取并预填充所有值。这可能就是我要做的。
/**
 * @ORM\MappedSuperclass
 */
abstract class project {
    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $description; 

    /**
     * @ORM\ManyToOne(targetEntity="Bundle\Customer")
     */
    private $customer;

    /**
     * @ORM\ManyToOne(targetEntity="Bundle\CustomerContact")
     */
    private $customercontact;

    ... (getters/setters etc.)
}

class quote extends project { ... }
class order extends project { ... }