#doctrine-orm #relation
#doctrine-orm #отношение
Вопрос:
У меня есть две сущности Doctrine Order и Item. Для обоих этих объектов некоторые связанные файлы (один или несколько) могут храниться в базе данных. Информация о файле хранится в файловой сущности. Мне нужно определить отношения внутри объекта File, учитывая, что иногда file_owner_id может ссылаться на запись из таблицы Order, а в других случаях — на запись из таблицы Item. Владелец файла определяется значением поля owner_type.
Я пытался сделать так
/**
* UploadedFile
*
* @ORMTable(name="uploaded_file", indexes={@ORMIndex(name="file", columns={"file"})})
* @ORMEntity(repositoryClass="AppRepositoryItemFileRepository")
*/
class File
{
/**
* @var string
*
* @ORMColumn(name="owner_type", type="string", length=0, nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
*/
private $ownerType;
/**
* @ORMManyToOne(targetEntity="AppEntityItem", inversedBy="files")
* @ORMJoinColumn(name="owner_id", referencedColumnName="id", nullable=false)
*/
private $itemId;
/**
* @ORMManyToOne(targetEntity="AppEntityOrder", inversedBy="files")
* @ORMJoinColumn(name="owner_id", referencedColumnName="id", nullable=false)
*/
private $orderId;
...
}
но это не работает. При попытке сохранения у меня возникают ошибки. Итак, вопрос в том, есть ли у Doctrine какой-либо способ определить этот тип отношения сущности?
Комментарии:
1. В чем ваши ошибки? Что / как вы пытались их разрешить? Ваш вариант использования описывает
that sometimes file_owner_id can refer to record from Order table and in other cases it can refer to record from Item table
, не потребует ли этоnullable=false
дляorderId
иitemId
(если один установлен, другой нет). Затем вы должны включить логику, которая требует «другого», если установлен «один».2. Требуемая вам логика может быть выполнена (после / с учетом приведенного выше предложения) с использованием Подписчика . Попробуйте это;)
3. Из определения сущности вы можете видеть, что оба свойства класса ($ItemId и $OrderID) относятся к одному и тому же полю таблицы
owner_id
, где хранится идентификатор владельца файла.4. Хммм, пропустил это. Это ваша проблема. Ваш автомобиль не Fiat amp; Volvo, даже если это тип автомобиля. Как насчет того, чтобы отменить это и ссылаться на File как из Item, так и из Order с однонаправленными связями, помещая владельца туда, где это (казалось бы) более логично?