>我在图像和图像元数据之间有一个一对一的关系,其中图像元数据是可选的,但在图像没有相关元数据记录的情况下,列表失败:
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列,但如果您以这种方式定义实现,甚至可能没有必要。