Как заставить Доктринский каскад продолжать работать?

Я работаю над приложением ZF2 / Apigility с использованием Doctrine v2.4.2,

Структура модели выглядит следующим образом: an Asset has an Attachment (так что это 1:1 отношения):

введите описание изображения здесь

Проблема в том, что я не могу Asset со встроенным Attachment и получите ошибку

23000, 1048, столбец attachment_linkassetuuid не может быть пустым

Похоже, что Доктрина пытается спасти Attachment во-первых, не могу найти значение для столбца attachment_linkassetuuid, устанавливает его nullи ограничение внешнего ключа нарушено.

Как правильно определить сущности и заставить работать каскад?


Asset

namespace MyDoctrineDataAccess\Model\Entity;
...
/**
* Asset
*
* @ORM\Table(name="tbl_asset")
* @ORM\Entity
*/
class Asset
{
/**
* @var string @ORM\Column(name="asset_uuid", type="string", length=36, nullable=false)
* @ORM\Id
*/
private $uuid;

/**
* @var \MyDoctrineDataAccess\Model\Entity\Attachment
* @ORM\OneToOne(targetEntity="MyDoctrineDataAccess\Model\Entity\Attachment", mappedBy="asset", cascade={"remove", "persist"}, orphanRemoval=true)
*/
private $attachment;
...
}

/**
* @param \MyDoctrineDataAccess\Model\Entity\Attachment $attachment
*/
public function setAttachment($attachment) {
$this->attachment = $attachment;
return $this;
}

/**
* @return the $attachment
*/
public function getAttachment() {
return $this->attachment;
}

Attachment

namespace MyDoctrineDataAccess\Model\Entity;
...
/**
* Attachment
*
* @ORM\Table(name="tbl_attachment", indexes={@ORM\Index(name="fk_attachment_uuid", columns={"attachment_linkassetuuid"})})
* @ORM\Entity
*/
class Attachment
{
/**
*
* @var string @ORM\Column(name="attachment_uuid", type="string", length=36, nullable=false)
*      @ORM\Id
*/
private $uuid;

/**
*
* @var \MyDoctrineDataAccess\Model\Entity\Asset
* @ORM\OneToOne(targetEntity="\MyDoctrineDataAccess\Model\Entity\Asset", inversedBy="attachment", cascade={"persist"})
* @ORM\JoinColumn(name="attachment_linkassetuuid", referencedColumnName="asset_uuid")
*/
private $asset;
...
}

/**
*
* @param \MyDoctrineDataAccess\Model\Entity\Asset $asset
*/
public function setAsset($asset)
{
$this->asset = $asset;
return $this;
}

/**
*
* @return the $asset
*
*/
public function getAsset()
{
return $this->asset;
}

AssetService

namespace MyApi\V1\Rest\Asset;
...
class AssetService implements ServiceManagerAwareInterface
{
...
public function saveAssets($data)
{
$entityManager = $this->serviceManager->get('Doctrine\ORM\EntityManager');
$assetRepository = $entityManager->getRepository('My\Model\Entity\Asset');
$hydratorManager = $this->serviceManager->get('hydratormanager');
$hydrator = $hydratorManager->get('My\\Model\\Entity\\Hydrator\\EntityHydrator');
foreach ($data as $assetData) {
$asset = new Asset();
$hydrator->hydrate($assetData, $asset);
$entityManager->persist($asset);
$entityManager->flush();
}
}
...
}

1

Решение

поскольку @JoinColumn по умолчанию nullable в true в соответствии с документацией доктрины Я не очень понимаю ошибку. Но я вижу это в вашем Attachment юридическое лицо @table По определению вы объявляете индекс:

indexes={@ORM\Index(name="fk_attachment_uuid", columns={"attachment_linkassetuuid"})}

Попробуйте один раз удалить это, перестройте свою базу данных и проверьте, решает ли она вашу проблему. Если нет, то оставьте комментарий, и я посмотрю еще раз.

Проверьте OneToOne пример в документации доктрины. Добавление @index как ты не упоминается там. Doctrine автоматически добавит необходимые индексы в ваши столбцы отношений.

ОБНОВИТЬ:

Я думаю, что проблема может быть в том, что Asset не владеющая сторона отношений. Проверьте документацию Вот. Попробуйте изменить свой setAttachment метод как это:

public function setAttachment($attachment)
{
$this->attachment = $attachment;
$attachment->setAsset($this);
return $this;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]