【发布时间】:2015-07-31 21:28:37
【问题描述】:
我正在使用 Doctrine v2.4.2 开发 ZF2/Apigility 应用程序。
模型结构如下:anAssethasanAttachment(所以,这是1:1关系):
问题是我无法使用嵌入的Attachment 持久化Asset 并得到错误
23000, 1048, 列 'attachment_linkassetuuid' 不能为空
看来Doctrine先尝试保存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();
}
}
...
}
【问题讨论】:
-
您的补水器确实工作正常吗,它是否为
Asset和Attachment补水?另外,不是从hydrate返回的水合对象,除非您已将其自定义为通过引用传递?例如$hydrated_object = $hydrator->hydrate($assetData, new Asset()); -
您好,感谢您的评论!我刚刚检查过这个。在持久化 (
$entityManager->persist($asset);) 的那一刻,Asset实体已正确构建,其属性attachment是Attachment实体对象。
标签: php doctrine-orm zend-framework2 one-to-one laminas-api-tools