У меня есть отношение OneToOne между Image и ImageMetadata, где 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 ().
Я ожидаю, что он вернет ноль, если связанная сущность не существует.
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 (). Я испробовал предложения, найденные здесь и на других форумах, установив EAGER, изначально установив нулевое значение, удалив сирот и т. Д., Но мне все равно что-то не хватает.
Спасибо!
Вы используете аннотацию JoinColumn на неправильной стороне отношения. Попытайтесь создать двунаправленное отношение (поскольку сторона-владелец определяется тем, какой объект хранит идентификатор отношения — что является метаданными в вашем случае, поэтому аннотация 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
но может даже не понадобиться, если вы определите реальность таким образом.
Других решений пока нет …