У меня есть две сущности, Item и SpecialItem
SpecialItem расширяет Item, где Item — это обычный торговый объект со свойством Price, а SpecialItem — это торговый объект в продаже с дополнительным дисконтным свойством.
я использую Наследование таблицы классов
Предмет:
<?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;}
Специальный пункт:
<?phpnamespace 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 и сохранил его (теперь у него есть одна строка в элементе таблицы и одна строка в specialitem таблицы со значением скидки), а теперь я решил удалить скидку, чтобы специальный элемент теперь был обычным элементом.
Как удалить только строки, связанные со скидкой, а не весь элемент, и изменить столбец DiscriminatorColumn, чтобы он отражал родительский тип элемента?
Насколько я знаю, вы не можете изменить тип объекта (дискриминатор) напрямую.
1) Вы можете написать простой SQL-запрос (плохая идея, но идентификатор остается прежним):
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();
Других решений пока нет …