2015-11-16 16 views
5

Ho un'entità che si riferisce a se stessa. L'entità ha campi: genitore e bambini.symfony2 doctrine - Aggiunta di bambini a entità auto-correlate

class A 
{ 
    // ... 

    /** 
    * @var A 
    * @ORM\ManyToOne(targetEntity="A", inversedBy="children") 
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
    */ 
    protected $parent; 

    /** 
    * @var A[] 
    * @ORM\OneToMany(targetEntity="A", mappedBy="parent", cascade={"all"}, orphanRemoval=true) 
    */ 
    protected $children; 
} 

voglio aggiungere i bambini a questa entità attraverso la creazione di bambini in forma. Questo tipo di entità simile a questa:

class AType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      // ... 
      ->add('children', 'collection', [ 
       'type' => new AType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'by_reference' => false, 
       'prototype' => true, 
      ]) 
     ; 
    } 
} 

Quando invio dei dati in questo modo:

'a' => [ 
    [ 
     'name' => 'main a', 
     'children' => [ 
      [ 
       'name' => 'child a 1', 
      ], 
      [ 
       'name' => 'child a 2', 
      ], 
     ], 
    ], 
], 

(in prova, non ho vista, perché questa applicazione si basa sulla piena comunicazione API REST) ho ottenuto questo errore:

PHP Fatal error: Maximum function nesting level of '100' reached, aborting!

Quindi, è anche possibile aggiungere i bambini a soggetti autonomi connessi?

Funzionerebbe se ho 2 entità: entità A con campi figli relativi all'entità B. Ma, può funzionare con questa relazione?

Devo cambiare tipo in AType classe da new AType() a qualcosa di diverso.

MODIFICA: In realtà voglio solo ottenere i dati e convalidarli. Non ho bisogno del modulo HTML per visualizzarlo. Posso farlo in questo modo:

// controller 
$jms = $this->get('jms_serializer'); 
$entity = $jms->deserialize($request->getContent(), 'AcmeBundle\Entity\A', 'json'); 

$this->em->persist($entity); 
$this->em->flush(); 

senza utilizzare Modulo nel controller. Ma in questo caso i miei dati non saranno convalidati.

+0

Stai provando a serializzare la tua entità ad un certo punto? L'auto referenza può causarlo e devi implementare le tue regole di serializzazione. – stevenll

+0

No. Cerco solo di aggiungere questo e basta. La mia azione nel controller sembra totalmente normale e restituisce una risposta vuota. –

+0

Provare a [aumentare il valore xdebug] (http: // stackoverflow.it/questions/4293775/crescente-nesting-functions-calls-limit/4293870 # 4293870): 'xdebug.max_nesting_level = 200'. Dovrebbe darti il ​​vero errore. –

risposta

0

vi suggerisco di dare un'occhiata qui: https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#tree-entity-example

La struttura id DB si basa su altri campi memorizzati nel DB così a parte parentID.

il modello di E 'sulla base di questo: https://en.wikipedia.org/wiki/Nested_set_model

+0

Posso farlo, non è un problema. Ma in questo esempio sono basati sull'impostazione genitore. Ho bisogno di preparare bambini e figli di bambini. E anche bisogno di usarlo con il tipo di modulo. –

3

PHP Fatal error: Maximum function nesting level of '100' reached, aborting!

Perché hai ricorsione. Quando chiami createForm, prova a risolvere type.

È possibile trovare questa parte di codice nella funzione FormFactoryresolveType.

Penso che sia possibile creare un secondo tipo di modulo che include title e parent.

class AType extends AbstractType{ 
    //... 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('title') 
     ->add('parent') 
     ->add('children', 'collection', array(
      'type' => new BType(), 
      'allow_add' => true, 
      'allow_delete' => true, 
      'by_reference' => false, 
      'prototype' => true 
     )); 
    } 
} 

class BType extends AbstractType { 
    //.. 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
     ->add('title') 
     ->add('parent'); 
    } 
} 

penso costruttore modulo può recuperare e mappare Content-Type:application/x-www-form-urlencoded. Ho implementato con il modulo html. Inoltre ho provato a inviare application/json ma il risultato non ha avuto esito positivo. Ecco perché qui puoi usare i validatori dello schema JSON.

+0

Ci stavo pensando. Ma in questo caso non riesco a impostare i dati multilivello. Posso impostare solo 2 livelli. –

Problemi correlati