可选相关教义实体(一对一关系)



>我在图像和图像元数据之间有一个一对一的关系,其中图像元数据是可选的,但在图像没有相关元数据记录的情况下,列表失败:

An exception has been thrown during the rendering of a 
template ("Entity of type 'AppEntityImageMetadata' for IDs imageid(2043) was not found").

树枝叫声很简单

{{ image.meta ? 'hasMeta' }} 

它变成了对 $image->getMeta() 的调用。

如果相关实体不存在,我希望它返回 null。

图像.php将元数据定义为可选:

class Image   
{
/**
* @ORMColumn(type="integer", name="id")
* @ORMId
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMOneToOne(targetEntity="AppEntityImageMetadata", orphanRemoval=true, fetch="EAGER")
* @ORMJoinColumn(name="id", referencedColumnName="imageid", nullable=true)
*/
private $meta;
public function getMeta(): ?ImageMetadata
{
return $this->meta;
}

ImageMetadata.php使用相同的键("imageid")

class ImageMetadata
{
/**
* @ORMColumn(type="integer", name="imageid")
* @ORMId
*/
private $imageid;

不幸的是,我没有调整数据库的选项,所以我正在尝试定义Doctrine配置以反映现有数据库并正确填充要在Symfony应用程序中使用的实体。 表定义为:

CREATE TABLE Images
(id INTEGER PRIMARY KEY, ...);
CREATE TABLE ImageMetadata (imageid INTEGER PRIMARY KEY,...);

有些图像没有元数据,但是当我调用 $image->getMeta() 时,我不知道如何简单地让教义返回 null。 我已经尝试了我在这里和其他论坛中找到的建议,设置 EAGER,最初将其设置为 null,删除孤儿等,但我仍然必须缺少一些东西。

谢谢!

您在关系的错误一侧使用了 JoinColumn 注释。尝试建立双向关系(因为拥有方是由哪个实体存储了关系 ID 定义的 - 这是您案例中的元数据,因此 JoinColumn 注释属于该实体)。

像这样:

class Image   
{
/**
* @ORMColumn(type="integer", name="id")
* @ORMId
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMOneToOne(targetEntity="AppEntityImageMetadata", mappedBy="image", orphanRemoval=true, fetch="EAGER")
*/
private $meta;
class ImageMetadata
{
/**
* @ORMOneToOne(targetEntity="AppEntityImage", inversedBy="meta")
* @ORMJoinColumn(name="imageid", referencedColumnName="id")
* @ORMId
*/
private $image;

注意:只是说nullable可能是不可能的,因为该列是ImageMetadata的ID列,但如果您以这种方式定义实现,甚至可能没有必要。

相关内容

  • 没有找到相关文章