Необязательная связанная сущность доктрины (отношение 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 ().

Я ожидаю, что он вернет значение 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,...);

Есть изображения без метаданных, но я не могу понять, как просто заставить доктрину возвращать значение null, когда я вызываю $ image-> getMeta (). Я пробовал предложения, которые нашел здесь и на других форумах, установил EAGER, сначала установил для него значение null, удалил сирот и т. д., Но мне все равно что-то не хватает.

Спасибо!

Есть ли у вас FK-ограничения между таблицами? Ошибка указывает на то, что таблица Images имеет значение imageid, которого нет в ImageMetadata, поэтому Doctrine пытается гидратировать нарушенные отношения O2O.

yceruto 16.03.2018 15:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 031
1

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

Спасибо, я пробовал это, но получаю (1/1) AnnotationException [Ошибка создания] Аннотация @ORM \ JoinColumn, объявленная в свойстве App \ Entity \ ImageMetadata :: $ image, не имеет свойства с именем «conversedBy». Доступные свойства: name, referencedColumnName, unique, nullable, onDelete, columnDefinition, fieldName. Но на самом деле это не двунаправленное соединение, не так ли?

Tac Tacelosky 16.03.2018 15:57

Отношения какие-то странные. Вы хотите использовать его только в Image, но на самом деле он хранится в ImageMetadata, поэтому вы также должны объявить его там, сделав его двунаправленным.

ChristianM 16.03.2018 16:04

Другие вопросы по теме