Я застрял на этом. Вот что я получил:Двунаправленное саморегуляционное сопоставление с дополнительными полями в доктрине 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
Можете ли вы сказать нам, что не работает более точно? –
Постараюсь, насколько могу. Что конкретно вы имеете в виду? –
Прямо сейчас вы говорите, что не знаете, как заставить их работать вместе. Вы получаете какие-либо ошибки?Сохраняются ли данные? –