Symfony ManyToMany Problem

Symfony ManyToMany Problem
K7
  • Rejestracja: dni
  • Ostatnio: dni
0

symfony 6

Relacja ManyToMany tworzona poprzez
bin/console make:entity

Problem leży w tym, że symfony tworzy błędne indexy.

Mam dwie relacje ManyToMany

Kopiuj
namespace App\Entity;

class Faktura
{
   #[ORM\ManyToMany(targetEntity: FakturaWiersz::class, cascade:["persist", "remove"])]
    private Collection $wiersze;

    #[ORM\ManyToMany(targetEntity: PodsumowanieFakturyZaliczka::class, cascade:["persist", "remove"])]
    private Collection $zaliczki;

problem jest z drugą.

Indeksy 1
Działanie Nazwa klucza Typ Jednoznaczny Spakowany Kolumna Moc Metoda porównywania napisów Null Komentarz
Edytuj Edytuj Zmień nazwę Zmień nazwę Usuń Usuń PRIMARY BTREE Tak Nie faktura_id 48 A Nie
faktura_wiersz_id 48 A Nie
Edytuj Edytuj Zmień nazwę Zmień nazwę Usuń Usuń IDX_E2EA755A23AA62EA BTREE Nie Nie faktura_id 48 A Nie
Edytuj Edytuj Zmień nazwę Zmień nazwę Usuń Usuń IDX_E2EA755AB4038AEE BTREE Nie Nie faktura_wiersz_id 48 A Nie

screenshot-20240410111832.png

Drugi
screenshot-20240410111918.png
Różnią się tylko nazwami i polem "Moc"

Przy dodawaniu nowej wartości w pierwszej relacji mam pole wyboru
screenshot-20240410112147.png
W przypadku drugiej realcji mam zwykłe pole do wpisania
screenshot-20240410112254.png

Mimo w zasadzie takich samych pól definicja bazy jest inna.
Oczywiście druga relacja nie zapisuje się

błąd Could not determine access type for property "zaliczki" in class "App\Entity\Faktura".

po dodaniu settera w nadrzędnej klasie (Faktura)

Kopiuj
public function setZaliczki(Collection $zaliczki): static
    {
        $this->zaliczki = $zaliczki;
        
        return $this;
    }

nie ma błędu ale oczywiście nie zapisuje danych.

Z dziwnych rzeczy

Forma zdefiniowana:

Kopiuj
->add('zaliczki', CollectionType::class, [
                    'entry_type' => PodsumowanieFakturyZaliczkaType::class,
                    'entry_options' => ['label' => false],
                    'by_reference' => false,
                    'allow_add' => true,
                    'allow_delete' => true,
                ])                
                ->add('wiersze', CollectionType::class, [
                    'entry_type' => FakturaWierszNewType::class,
                    'entry_options' => ['label' => false],
                    'by_reference' => false,
                    'allow_add' => true,
                    'allow_delete' => true,
                ])

Więc identyczne - poza nazwami

Pokazując formę widzę na niej rekord zaliczek
ale przy debugowaniu

Kopiuj
if ($form->isSubmitted() && $form->isValid()) {
            echo " <pre> ";var_dump($form); echo " </pre> ";die;

widzę brak zaliczki.

Kopiuj
["request"]=>
                            object(Symfony\Component\HttpFoundation\InputBag)#54 (1) {
                              ["parameters":protected]=>
                              array(1) {
                                ["faktura_new"]=>
                                  ["opis"]=>
                                  string(0) ""
                                  ["wiersze"]=>  <- wiersze są 
                                  array(1) {
                                    [0]=>
                                    array(8) {
                                      ["nazwa"]=>                                     

czyli tak jakby nie przesyłał w ogóle zaliczki.

Pytanie gdzie jest błąd i jak to naprawić.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

W przypadku drugiej realcji mam zwykłe pole do wpisania

To nie jest zwykłe pole. Zwykłe pola nie mają obok linka "Przeglądaj zewnętrzne wartości". Indeks jest założony prawidłowo, ale strzelam, że tabela będąca celem klucza obcego jest pusta, dlatego nie ma tam dropki listującej wartości (bo nie ma żadnych wartości do wylistowania).

Sprawdź w kodzie, czy na pewno odpowiednie formularze *Type są podpięte do właściwych encji.
Zauważ, że dla wierszy masz FakturaWierszNewType i FakturaWiersz, tzn. formularz i encja różnią się cząstką New.
Dla zaliczek nie ma New, a może też powinno być?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.