Как правильно определить отношение одного поля к нескольким таблицам (по условию)

#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 с однонаправленными связями, помещая владельца туда, где это (казалось бы) более логично?