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






Вы используете аннотацию 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. Но на самом деле это не двунаправленное соединение, не так ли?
Отношения какие-то странные. Вы хотите использовать его только в Image, но на самом деле он хранится в ImageMetadata, поэтому вы также должны объявить его там, сделав его двунаправленным.
Есть ли у вас FK-ограничения между таблицами? Ошибка указывает на то, что таблица
Imagesимеет значениеimageid, которого нет вImageMetadata, поэтому Doctrine пытается гидратировать нарушенные отношения O2O.