2015-09-15 7 views
0

Каков наилучший способ обработки объекта File, где у вас есть несколько отношений ManyToOne.Symfony: Обработка файловой сущности

Предположим, у меня есть 5 объектов, которые имеют отношение OneToMany к объекту File.

file.php

/** 
* @ORM\ManyToOne(targetEntity="Entity1", inversedBy="files") 
* @ORM\JoinColumn(name="entity1_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
private $entity1; 

/** 
* @ORM\ManyToOne(targetEntity="Entity2", inversedBy="files") 
* @ORM\JoinColumn(name="entity2_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
private $entity2; 

and so one.... 

Entity1.php

/** 
* @ORM\OneToMany(targetEntity="File", mappedBy="entity1" , cascade={"persist", "remove"}, orphanRemoval=true) 
*/ 
protected $images; 

Самое замечательное выше, является геттер и сеттер установлены, я может сохраняться и сохранять в базе данных автоматически. Связь установлена, и я могу загрузить файлы, просто позвонив $entity1->getFiles().

Что мне не нравится - каждый раз, когда я хочу добавить еще одну сущность с OneToMany с File, она создает новый столбец в базе данных, поэтому я мог бы иметь 10 столбцов, ссылающихся на Идентификаторы от других объектов.

То, что я хотел бы достичь экономии в класс лица в class области и сохранение id в записи в id поле, но и как-то по-прежнему позволяет сохраняться и сбор экономии на работу.

entity_id | class 
------------------------------------------ 
2   | ProjectBundle/Entity/Entity1 
3   | ProjectBundle/Entity/Entity2 

ответ

1

Не обязательно поле class.

Использование Doctrine's inheritance mapping путем создания базового класса для всех объектов, которые вы хотите передать из File:

/** 
* @ORM\Entity() 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="entityType", type="string") 
* @ORM\DiscriminatorMap({ 
*  "entity1" = "Entity1", 
*  "entity2" = "Entity2" 
* }) 
*/ 
abstract class BaseEntity 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="File", mappedBy="entities" , cascade={"persist", "remove"}, orphanRemoval=true) 
    */ 
    protected $images; 
} 

/** 
* @ORM\Entity 
*/ 
class Entity1 extends BaseEntity 
{ 
    ... 
} 

/** 
* @ORM\Entity 
*/ 
class Entity2 extends BaseEntity 
{ 
    ... 
} 

Таким образом, вы можете обратиться как к Entity1 и Entity2 их базового класса из File. При вызове getEntities Doctrine создает экземпляры соответствующего класса «автоматически» на основе значения дискриминатора для каждого объекта.

File

/** 
* @ORM\ManyToMany(targetEntity="Entity", inversedBy="images") 
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
protected $entities; 

OneToMany, ManyToOne стать ManyToMany, потому что теперь файл может иметь много объектов.

+0

Спасибо, Genti. Я понял это и использовал отображение наследования – user742736

+0

Есть ли причина, по которой я больше не могу получить какие-либо результаты, когда я пытаюсь использовать функцию findAll или find? '$ results = $ em-> getRespository ('File-> findAll()' Возвращает пустой массив – user742736

+0

Он не возвращает никаких записей, когда поле столбца 'entityType' пуст. Есть ли способ вернуть это Результаты? – user742736

 Смежные вопросы

  • Нет связанных вопросов^_^