如何删除子表行但将其父级保留在doctrine orm 2中的类表继承中?

时间:2016-04-21 00:25:13

标签: php symfony orm doctrine-orm class-table-inheritance

我有两个实体,Item和SpecialItem

SpecialItem扩展Item,其中Item是具有price属性的普通购物项目,SpecialItem是具有额外折扣属性的特价商品。

我正在使用Class Table Inheritance

项目:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * Item
 *
 * @ORM\Table(name="item")
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="item_type", type="string")
 * @ORM\DiscriminatorMap({"item" = "Item", "special" = "SpecialItem"})
 */

class Item
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

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

/**
 * @var string
 *
 * @ORM\Column(name="price", type="decimal", precision=10, scale=0, nullable=false)
 */
private $price;

/**
 * @var string
 *
 * @ORM\Column(name="description", type="text", length=65535, nullable=true)
 */
private $description;


}

特别项目:

<?php


 namespace AppBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;

 /**
 * @ORM\Entity
 */
 class SpecialItem extends Item
 {

 /**
 * @var string
 *
 * @ORM\Column(name="discount", type="decimal", precision=10, scale=0,   nullable=false)
 */
 private $discount;


 }

如果我创建了一个SpecialItem并保持它(现在它在表项目中有一行,在table specialitem中有一行具有折扣值),现在我决定删除折扣,因此特殊项目现在将是正常项目。

如何删除与折扣相关的行而不是整个项目,并更改DiscriminatorColumn以反映父类型项?

1 个答案:

答案 0 :(得分:0)

据我所知,你不能直接改变实体类型(鉴别器)。

1)您可以编写纯SQL查询(错误的想法,但ID保持不变):

 DELETE FROM special_item WHERE id = 15;

2)更干净的解决方案:创建Item的新实例并从SpecialItem复制数据。

class Item
{
     public static function fromSpecialItem(SpecialItem $specialItem)
     {
          $item = new self();
          $item->title = $specialItem->getTitle();

          return $item;
     }
}

$newItem = Item::fromSpecialItem($speciaItem);
$entityManager->remove($speciaItem);
$entityManager->persist($newItem);
$entityManager->flush();