【问题标题】:Symfony optional one to one relationshipSymfony 可选的一对一关系
【发布时间】:2020-12-04 17:24:35
【问题描述】:

我有一个实体 Photo 和另一个 PhotoNote ( 0 到 10 ) 照片可以有注释,但不能太多

当我请求照片实体时,我收到以下错误

未找到 ID idPhoto(1737) 的“App\Entity\PhotoNote”类型实体

在我的控制器中使用它

$photo = $photoRepository->findOneBy(['idPhoto' => $idPhoto]);

// check if there is a note
$note = (null !== $photo->getPhotoNote() ? $photo->getPhotoNote()->getNotePhoto() : 0);

// Also tried following
//$note = (null !== $photo->getPhotoNote()->getNotePhoto() ? $photo->getPhotoNote()->getNotePhoto() : null);

/**
 * --> this throws the error : $photo->getPhotoNote()->getNotePhoto()
 */

这里是$photo->getPhotoNote() 在 App\Entity\Photo 中的转储:

Photo.php on line 443:
Proxies\__CG__\App\Entity\PhotoNote {#5710 ▼
  +__isInitialized__: false
  -idPhoto: 1737
  -notePhoto: null
   …2
}

其实$photo->getPhotoNote() 不为空,photoNote 填充了 photoId。使用$photo->getPhotoNote()->getNotePhoto() 学说时会生成查询以获取关联的注释,但该照片没有注释。注意不是强制性的。

我想要的是“getPhotoNote”返回null 甚至0,但似乎一对一的关系需要一个现有的ID。

如何说教义返回null?

Class Photo {
    /**
     * @var int
     *
     * @ORM\Column(name="id_photo", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $idPhoto.

    // some fields

    /**
     * @ORM\OneToOne(targetEntity=“App\Entity\PhotoNote”)
     * @ORM\JoinColumn(name="id_photo", referencedColumnName="id_photo", nullable=true)
     */
    private $photoNote;

    public function setPhotoNote(PhotoNote $photoNote = null)
    {
        $this->photoNote = $photoNote;

        return $this;
    }

    public function getPhotoNote()
    {
        return $this->photoNote;
    } 
}

Class PhotoNote {
    /**
     * @ORM\Id()     
     * @ORM\Column(name="id_photo", type="integer")
     */
    private $idPhoto;

    /**
     * @ORM\Column(name="note_photo", type="smallint")
     */
    private $notePhoto;

    public function getNotePhoto(): ?int
    {
        return $this->notePhoto;
    }

    public function setNotePhoto(int $notePhoto): self
    {
        $this->notePhoto = $notePhoto;

        return $this;
    }
}

生成的查询:

SELECT
    t0.id_photo AS id_photo_1, 
    t0.note_photo AS note_photo_2
FROM 
    photo_note t0 
WHERE
    t0.id_photo = 1737;

【问题讨论】:

  • 你的 PhotoNote 类真的只有这些属性还是这是一个简化的例子?
  • @El_Vanja 表中只有两个字段,因此有两个属性。由于遗留原因,我无法更改 MySQL 结构上的任何内容
  • 我明白了。真的很不幸,因为没有理由让它成为一个单独的表。您是否尝试过显式添加referencedColumnName(在JoinColumn 注释中)?
  • 是的,但我在手机上写了这个问题,这就是为什么 sn-p 尽可能简单
  • 我同意没有理由将其作为单独的表。遗留项目真的是噩梦

标签: php doctrine-orm symfony5


【解决方案1】:

目前我发现的唯一方法是不使用这两个实体之间的关系。

我使用关联的存储库获取照片的注释

$note = $photoNoteRepo->findOneBy([
    'idPhoto' => $idPhoto
]);

if ( empty($note))
    $note = null;

我认为关系应该更好,但我被这个问题所困扰。

这是一个可行的解决方法,但它不能解决问题。 也许这里有人会给我一种使用关系的方法。

编辑

我找到了一种基于this的方法

public function getPhotoNote()
{
    if ($this->photoNote instanceof \Doctrine\ORM\Proxy\Proxy) {
        try {
            $this->photoNote->__load();
        } catch (\Doctrine\ORM\EntityNotFoundException $e) {
            return null;
        }
    }

    return $this->photoNote;
}

我读过一些关于教义事件的东西,尤其是 postLoad 事件,它看起来更干净,但我还没有成功实现它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多