2016-04-14 3 views
2

Я застрял на этом. Вот что я получил:Двунаправленное саморегуляционное сопоставление с дополнительными полями в доктрине 2

Я получил Document Entitiy, который способен иметь $previosDocuments и $nextDocuments .Это соотношение bidirectional и оба из них ArrayCollections. Но мне также нужно знать другую дополнительную информацию. Вот почему я получил DocumentRelation -Entity, который содержит дополнительные поля.

Примечание: Я знаю, что код ниже не подходит.

Это мой код до сих пор:

/** 
* @ORM\Entity 
* @ORM\Table(name="document") 
*/ 
class Document 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string $name 
    * @ORM\Column(type="string") 
    */ 
    protected $name; 

    /** 
    * @var ArrayCollection $nextDocuments 
    * @ORM\OneToMany(targetEntity="App\FrontEndBundle\Entity\DocumentRelation", mappedBy="document", cascade={"persist"}) 
    */ 
    protected $nextDocuments; 

    /** 
    * @var ArrayCollection $prevDocuments 
    * @ORM\OneToMany(targetEntity="App\FrontEndBundle\Entity\DocumentRelation", mappedBy="targetDocument", cascade={"persist"}) 
    */ 
    protected $prevDocuments; 

    /** 
    * Document constructor. 
    */ 
    public function __construct() 
    { 
     $this->prevDocuments = new ArrayCollection(); 
     $this->nextDocuments = new ArrayCollection(); 
    } 

    /** 
    * @param Document $nextDocument 
    * @return $this 
    */ 
    public function removeNextDocument($nextDocument) 
    { 
     if ($this->nextDocuments->contains($nextDocument)) { 
      $this->nextDocuments->removeElement($nextDocument); 
      $nextDocument->removePrevDocument($this); 
     } 
     return $this; 
    } 

    /** 
    * @param Document $nextDocument 
    * @return $this 
    */ 
    public function addNextDocument($nextDocument) 
    { 
     if (!$this->nextDocuments->contains($nextDocument)) { 
      $this->nextDocuments->add($nextDocument); 
      $nextDocument->addPrevDocument($this); 
     } 
     return $this; 
    } 

    /** 
    * @param Document $prevDocument 
    * @return $this 
    */ 
    public function addPrevDocument($prevDocument) 
    { 
     if (!$this->prevDocuments->contains($prevDocument)) { 
      $this->prevDocuments->add($prevDocument); 
      $prevDocument->addNextDocument($this); 
     } 
     return $this; 
    } 

    /** 
    * @param Document $prevDocument 
    * @return $this 
    */ 
    public function removePrevDocument($prevDocument) 
    { 
     if ($this->prevDocuments->contains($prevDocument)) { 
      $this->prevDocuments->removeElement($prevDocument); 
      $prevDocument->removeNextDocument($this); 
     } 
     return $this; 
    } 
    //getter + setter 
} 

/** 
* Class DocumentRelation 
* @package App\FrontEndBundle\Entity 
* @ORM\Entity 
* @ORM\Table(name="document_relation") 
*/ 
class DocumentRelation 
{ 

    /** 
    * @var Document $targetDocument 
    * @ORM\ManyToOne(targetEntity="App\FrontEndBundle\Entity\Document", inversedBy="id") 
    * @ORM\JoinColumn(name="target_document_id", referencedColumnName="id") 
    */ 
    protected $targetDocument; 

    /** 
    * @var Document $document 
    * @ORM\ManyToOne(targetEntity="App\FrontEndBundle\Entity\Document", inversedBy="id") 
    * @ORM\JoinColumn(name="document_id", referencedColumnName="id") 
    */ 
    protected $document; 

    [...] //$id & getter + setter 
} 

Моя проблема в том, что я не знаю, как заставить их работать вместе. Для любой идеи, помощи или намека я был бы очень благодарен!

EDIT: То, что я хочу конца является автореферентным объектом с двунаправленной ассоциацией и некоторыми дополнительными полями для хранения некоторой дополнительной информации о двунаправленной связи.

EDIT 2 @ Kuba-Birecki:

public function indexAction() 
{ 
    $this->createDocuments(); 

    return $this->render('AppFrontEndBundle:Default:index.html.twig'); 
} 

private function createDocuments() 
{ 
    $firstDocument = (new Document())->setName('first'); 
    $secondDocument = (new Document())->setName('second'); 

    $firstDocument->addNextDocument($secondDocument); 
    $em = $this->getDoctrine()->getManager(); 
    $em->persist($firstDocument); 
    $em->flush(); 
} 

Это способ, которым я стараюсь оставаться его, и это также, как мне нужно, чтобы назвать его.

Исключение составляет ниже

Найдено объект типа App \ FrontEndBundle \ Entity \ Документ об ассоциации App \ FrontEndBundle \ Entity \ Document # nextDocuments, но ожидая App \ FrontEndBundle \ Entity \ DocumentRelation

+0

Можете ли вы сказать нам, что не работает более точно? –

+0

Постараюсь, насколько могу. Что конкретно вы имеете в виду? –

+0

Прямо сейчас вы говорите, что не знаете, как заставить их работать вместе. Вы получаете какие-либо ошибки?Сохраняются ли данные? –

ответ

0

Ваши аннотации выглядят хорошо, но ваша бизнес-логика не отражает эти правила.

$nextDocuments из Document класс должен содержать коллекцию DocumentRelation, но в ваших методах вы пытаетесь вставить здесь Document объектов. То же самое касается $prevDocuments.

Все, что вам нужно изменить ваш Document класс для работы с DocumentRelation объектами вместо Document:

class Document 
{ 
    ... 

    /** 
    * @param DocumentRelation $relation 
    * @return $this 
    */ 
    public function removeNextDocument(DocumentRelation $relation) 
    { 
     if ($this->nextDocuments->contains($relation)) { 
      $this->nextDocuments->removeElement($relation); 
      $relation->setDocument(null); 
     } 

     return $this; 
    } 

    /** 
    * @param DocumentRelation $relation 
    * @return $this 
    */ 
    public function addNextDocument(DocumentRelation $relation) 
    { 
     if (!$this->nextDocuments->contains($relation)) { 
      $this->nextDocuments->add($relation); 
      $relation->setDocument($this); 
     } 

     return $this; 
    } 

    /** 
    * @param DocumentRelation $relation 
    * @return $this 
    */ 
    public function addPrevDocument(DocumentRelation $relation) 
    { 
     if (!$this->prevDocuments->contains($relation)) { 
      $this->prevDocuments->add($relation); 
      $relation->setTargetDocument($this); 
     } 

     return $this; 
    } 

    /** 
    * @param DocumentRelation $relation 
    * @return $this 
    */ 
    public function removePrevDocument(DocumentRelation $relation) 
    { 
     if ($this->prevDocuments->contains($relation)) { 
      $this->prevDocuments->removeElement($relation); 
      $relation->setTargetDocument(null); 
     } 

     return $this; 
    } 
} 

Конечно, это также означает, что вы должны создать/извлечь эти DocumentRelation объекты перед передачей их к этим методам.

Тогда, если, например, вы хотите, чтобы проверить, содержит ли $prevDocuments определенную Document, передавая ее непосредственно вместо DocumentRelation, вы могли бы сделать это так:

public function hasPrevDocument(Document $document) 
{ 
    // Iterate over DocumentRelations 
    foreach ($this->prevDocuments as $relation) { 
     // Check if the relation refers to the wanted document 
     if ($relation->getDocument() === $document) { 
      return true; 
     } 
    } 

    return false; 
} 

Я надеюсь, что это помогает.

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