J'essaye de travailler 4 entités dans Symfony 3 avec Doctrine 2 mais je suis coincé sur une exception de référence circulaire quand je veux sérialiser une entité Account par exemple:Symfony 3 Doctrine 2: Référence circulaire sur les relations
Une référence circulaire a été détectée (limite configurée: 1).
J'ai choisi les relations bi-directionnelles dans mes entités et le schéma est comme ceci:
- Account [1] ---- [0..*] AccountSheet
- AccountSheet [1] ---- [0..*] Operation
- Operation [0..*] ---- [1] Category
Voici les entités (avec quelques Nettoyages pour plus de clarté):
src \ AppBundle \ Entité \ Account.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use AppBundle\Entity\AbstractGenericEntity;
/**
* @ORM\Entity()
* @ORM\Table(name="accounts",
* uniqueConstraints={@ORM\UniqueConstraint(name="accounts_name_unique",columns={"name"})})
*/
class Account extends AbstractGenericEntity{
/**
* @ORM\OneToMany(targetEntity="AccountSheet", mappedBy="account")
* @var AccountSheet[]
*/
protected $accountSheets;
public function __construct($name = null, $description = null){
$this->accountSheets = new ArrayCollection();
$this->name = $name;
$this->description = $description;
}
}
src \ AppBundle \ En tité \ AccountSheet.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use AppBundle\Entity\AbstractGenericEntity;
/**
* @ORM\Entity()
* @ORM\Table(name="accounts_sheets",
* uniqueConstraints={@ORM\UniqueConstraint(name="accountsheet_account_unique", columns={"name", "account_id"})})
* @ORM\HasLifecycleCallbacks
*/
class AccountSheet extends AbstractGenericEntity{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Account", inversedBy="accountSheets")
* @var Account
*/
protected $account;
/**
* @ORM\OneToMany(targetEntity="Operation", mappedBy="accountSheet")
* @var Operation[]
*/
protected $operations;
public function __construct($name = null){
$this->operations = new ArrayCollection();
$this->name = $name;
}
}
src \ AppBundle \ Entité \ Operation.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\AbstractGenericEntity;
/**
* @ORM\Entity()
* @ORM\Table(name="operations")
*/
class Operation extends AbstractGenericEntity{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\AccountSheet", inversedBy="operations")
* @ORM\JoinColumn(nullable=false)
* @var AccountSheet
*/
protected $accountSheet;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="operations")
* @var Category
*/
protected $category;
public function __construct($type = null, $label = null, $montant = null, $comment = null){
$this->label = $label;
$this->type = $type;
$this->comment = $comment;
$this->montant = $montant;
}
}
src \ AppBundle \ Entité \ category.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use AppBundle\Entity\AbstractGenericEntity;
/**
* @ORM\Entity()
* @ORM\Table(name="categories")
*/
class Category extends AbstractGenericEntity{
/**
* @ORM\Column(type="string")
*/
protected $label;
/**
* @ORM\Column(type="string")
*/
protected $description;
/**
* @ORM\OneToMany(targetEntity="Operation", mappedBy="category")
* @var Operation[]
*/
protected $operations;
public function __construct($name = null){
$this->operations = new ArrayCollection();
$this->name = $name;
}
}
I suppose que c'est sur l'entité Operation, où AccountSheet est référencé à nouveau. Le fonctionnement bidirectionnel n'est pas vraiment nécessaire.
Comment est-ce que je peux réorganiser ceci?
Merci!
'Le bi-directionnel sur le fonctionnement n'est pas vraiment needed.' Donc, ne pas l'utiliser :) Vous pouvez utiliser unidirectionnels –
@AnomalySmith Que vos constructeurs regarder comme? –
@MaxLipsky Comme le doc spécifie une relation One To Many doit être bidirectionnelle, je suppose que je n'ai pas le choix? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional. – AnomalySmith