我在Image和ImageMetadata之间有一个OneToOne关系,其中ImageMetadata是可选的,但在Image没有相关的元数据记录的情况下,列表失败:
An exception has been thrown during the rendering of a
template ("Entity of type 'App\Entity\ImageMetadata' for IDs imageid(2043) was not found").
树枝电话只是
{{ image.meta ? 'hasMeta' }}
成为对$ image-> getMeta()的调用。
如果相关实体不存在,我希望它返回null。
Image.php将元数据定义为可选:
class Image
{
/**
* @ORM\Column(type="integer", name="id")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\ImageMetadata", orphanRemoval=true, fetch="EAGER")
* @ORM\JoinColumn(name="id", referencedColumnName="imageid", nullable=true)
*/
private $meta;
public function getMeta(): ?ImageMetadata
{
return $this->meta;
}
ImageMetadata.php使用相同的密钥(“imageid”)
class ImageMetadata
{
/**
* @ORM\Column(type="integer", name="imageid")
* @ORM\Id
*/
private $imageid;
不幸的是,我没有调整数据库的选项,因此我尝试定义Doctrine配置以反映现有数据库并正确填充要在Symfony应用程序中使用的实体。表定义是:
CREATE TABLE Images
(id INTEGER PRIMARY KEY, ...);
CREATE TABLE ImageMetadata (imageid INTEGER PRIMARY KEY,...);
有没有元数据的图像,但是当我调用$ image-> getMeta()时,我无法弄清楚如何让doctrine返回null。我已经尝试了我在这里和其他论坛中找到的建议,设置EAGER,最初将其设置为null,删除孤儿等,但我仍然必须遗漏一些东西。
谢谢!
答案 0 :(得分:0)
您正在关系的错误一侧使用JoinColumn注释。尝试进行双向关系(因为拥有方是由哪个实体存储了关系id定义的 - 在您的情况下是元数据,因此JoinColumn注释属于)。
这样的事情:
class Image
{
/**
* @ORM\Column(type="integer", name="id")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\ImageMetadata", mappedBy="image", orphanRemoval=true, fetch="EAGER")
*/
private $meta;
class ImageMetadata
{
/**
* @ORM\OneToOne(targetEntity="App\Entity\Image", inversedBy="meta")
* @ORM\JoinColumn(name="imageid", referencedColumnName="id")
* @ORM\Id
*/
private $image;
注意:只是认为nullable
可能无法实现,因为该列是ImageMetadata
的ID列,但如果以这种方式定义实现,则可能甚至不需要。