Необязательная сущность связанной доктрины (отношения OneToOne)

У меня есть отношение 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, изначально установив нулевое значение, удалив сирот и т. Д., Но мне все равно что-то не хватает.

Спасибо!

-1

Решение

Вы используете аннотацию 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 но может даже не понадобиться, если вы определите реальность таким образом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]