可选的相关学说实体(OneToOne关系)

时间:2018-03-16 14:12:13

标签: php symfony doctrine-orm nullable one-to-one

我在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,删除孤儿等,但我仍然必须遗漏一些东西。

谢谢!

1 个答案:

答案 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列,但如果以这种方式定义实现,则可能甚至不需要。