Я работаю над приложением 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();
}
}
...
}
поскольку @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;
}
Других решений пока нет …