[Doctrine] OneToMany inversed side automatisch invullen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Ik heb een entity Card die een aantal OneToMany relaties heeft. ter illustratie gebruik ik hier CardAttack:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CardRepository")
 * @ORM\Table(name="card")
 */
class Card
{
  ...
  
  /**
   * @ORM\OneToMany(targetEntity="\AppBundle\Entity\CardAttack", mappedBy="card", cascade="persist")
   * @ORM\OrderBy({"id"="ASC"})
   */
  private $cardAttacks;

  ...
}

/**
 * @ORM\Entity
 * @ORM\Table(name="card_attack")
 */
class CardAttack
{
  ...
  
  /**
   * @Assert\NotBlank()
   * @Assert\Type("\AppBundle\Entity\Card")
   * @Assert\Valid()
   * 
   * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Card", inversedBy="cardAttacks")
   * @ORM\JoinColumn(name="card_id", referencedColumnName="id")
   */
  private $card;

  ...
}


Om een nieuwe card toe te voegen, heb ik een form waarin oa cardAttacks in te vullen zijn. De bedoeling is dat ik eenvoudig het gehele door de form bekomen card object kan persisten, maar het probleem is dat bij het invullen van de form de card referentie (inversed side) in cardAttack op null blijft.

Ik zou dit dus telkens manueel moeten toekennen voordat ik card persist:

code:
1
2
3
4
foreach ($card->getCardAttacks() as &$cardAttack)
{
    $cardAttack->setCard($card);
}


Ik heb een stuk of 5 andere (inclusief geneste) velden zoals cardAttack, dus dit wordt al snel een omslachtige boel. Bestaat er een manier om dit automatisch te laten gebeuren?

Beste antwoord (via NMe op 19-09-2017 22:46)


  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Na lang zoeken heb ik uiteindelijk gevonden waarom card null bleef: http://symfony.com/doc/cu...lection.html#by-reference

(Hoe duid ik mijn eigen reactie als antwoord aan?)

Alle reacties


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gewoon de set- of add-functie aan de andere kant uitbreiden met de relevante set of add (afhankelijk van het type relatie)?

Je probleem zit hem trouwens eerder in Doctrine dan in Symfony dus ik pas je titel even aan.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
NMe schreef op woensdag 19 april 2017 @ 23:52:
Gewoon de set- of add-functie aan de andere kant uitbreiden met de relevante set of add (afhankelijk van het type relatie)?

Je probleem zit hem trouwens eerder in Doctrine dan in Symfony dus ik pas je titel even aan.
Ik weet niet exact hoe de symfony form component dit afhandelt, maar de setter lijkt nooit opgeroepen te worden (reflection?):

code:
1
2
3
4
5
6
public function addCardAttack(CardAttack $cardAttack)
{
    $cardAttack->setCard($this);
    $this->cardAttacks[] = $cardAttack;
    return $this;
}


Na het submitten van de form blijft card null.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$card = new Card();

$form = $this->createForm(
    CardType::class,
    $card,
    array('method' => 'POST')
);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid())
{
    dump($card); // $card->getCardAttacks()[0]->getCard() === null
}

[ Voor 3% gewijzigd door egonolieux op 20-04-2017 03:33 ]


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Na lang zoeken heb ik uiteindelijk gevonden waarom card null bleef: http://symfony.com/doc/cu...lection.html#by-reference

(Hoe duid ik mijn eigen reactie als antwoord aan?)