Symfony - dodatkowy atrybut do klasy Entity.

0

Witam,

Czy mozna dodać do entity atrybut, który nie będzie zapisywany do bazy danych? Mam import zamówień przez REST API do mojej apki napisanej w Symfony. Zamówinia mają kupony (tablica). Musze sprawdzić czy jest kupon i obliczyć zniżkę. Nie chce zapisywać informacji o kuponie do db. To co zrobiłem, to dodałem do klasy entity order, atrybut kupon. Problem jest w tym, że jak API zwraca zamówienie z kuponem to tworzocy obiek zamówienia nie posiada tego kuponu. Atrybut jest pusty. Nie rozumiem, dlaczego się tak dzieje?

0

Możesz. Po prostu zmienne, które nie mają odpowiedniego nagłówka(adnotacji - czy jak to się nazywa) nie będą uwzględniane przy zapisie do bazy, będą jak zwykłe pola klasy.

0

@Kandif: Fakt, zgadzam sie. Tylko, ze w projekcie jest bundle, ktory wykonuje import tych produktow. I tam tworzy obiekt entity i nie wiem dlaczego gubi moje dodane pole klasy (kupon). Kombinowalem, z naglowkami i bez. Szukalem czy jest gdzies tablica ze zdefiniowanymi polami, ale nic nie ma. Zaczalem debugowac ten bundle, ale tam jest tyle odniesien, z jednego pliku skacze do 9999... I ta sciezka wyglada jakby nigdy sie nie miala skonczyc.

edit
Podejrzewalem, ze moze klasa jest czytana przez reflectionclass i pobiera tak wszystkie pola klasy. Jednak wychodzi, ze tez nie.

0

Fragmnt klasy entity Order.php:

    /**
     * @var ArrayCollection|OrderDiscounts[]
     *
     * @ORM\OneToMany(targetEntity="OrderDiscounts", mappedBy="owner", cascade={"all"}, orphanRemoval=true)
     */
    protected $discountCoupons;


    /**
     * @return $this
     */
    public function getDiscountCoupons()
    {
        return $this->discountCoupons;
    }

    /**
     * @param array $discountCoupons
     */
    public function setDiscountCoupons($discountCoupons)
    {
        $this->discountCoupons = $discountCoupons;
    }

0

Czy to moze byc zwiazane z cache? Zaczalem debugowac kod. Nie rozumiem jeszcze jak bundle czyta pola klasy, ale wiedze, ze tak jest jakis cache. lol

0

Naprawde sprobowalem juz sporo rzeczy i nic nie dziala. Musze przyznac, ze nie jest lekkie w nauce te Symfony.

0

Jakiej klasy jest obiekt który jest tworzony przez bundle przy imporcie? Czy to jest Twoja klasa czy stdClass? Mimo, że nie znam się dobrze na symfony i nie używam (lubię Phalcona), to może coś wydedukuję i pomoge w wolnym momencie.

0

a wg mnie trochę źle do tego podchodzisz. Entity w symfony winno być wyłącznie do trasportowania danych z bazy danych dalej. Nie powinien on mieć dodatkowych pól czy funkcjonalności. Tak, doctrine działą z wykorzystaniem reflection class i Bóg raczy wiedzieć co tam się dokładnie dzieje.

Wykorzystuj entity wyłącznie do odczytywania/zapisywania danych do/z bazy danych i takich problemów mieć nie będziesz

0

@no_solution_found: Zgadzam sie z Toba. Problem jest w tym, ze ja tego nie napisalem. Troche zajmie przerobienie tego. A musze dodac tylko jedno pole klasy. Co jest naprawde komiczne w tym momencie. W dokumentacji symfony niczego NIE MA o niewidzialnosci pol klasy etc. Co moglem to zrobilem. Zaraz bede dalej walczyl, ale przyznam troche to przegiecie ze strony symfony, zeby tak dlugo siedziec nad jedna rzecza.

edit Widzialem jakis cache, zastanawiam sie czy to moze byc przez to?
php app/console cache:clear -e prod Tak czy siak to niczego nie zmienia.

0

to działa przez refleksję od lat :) to nie jest wina symfony, że masz źle zaprojektowaną aplikację. Refleksje pomagają optymalizować działanie biblioteki. Bez tego miałbyś jakieś dziwaczne dziedziczenie jak w doctrine 1.

0

To co zrobic, zeby te pole bylo widoczne? To powinna byc prosta sprawa. Dodalem standardowe pole bez naglowkow. Nastepnie z naglowkami i pole do tabeli db. I jedno wielkie nic :D

0

Naprawde wydaje mi sie, ze te pola klasy sa trzymane przez jakis cache (redis) czy cos nie wiem...

0

Musi cos byc do aktualizowania entity albo jakis caxhe.

0

Trochę offtopowo ale nie całkiem.

no_solution_found napisał(a):

to działa przez refleksję od lat :) to nie jest wina symfony, że masz źle zaprojektowaną aplikację.

Jest jeszcze inna opcja - to Doctrine jest zaprojektowane mało elastycznie, inne ORMy nie mają takich problemów.

W Phalconie np. mam klasę, nazwijmy ją \k3\product\EntityProduct, gdzie część zmiennych jest skojarzona z bazą danych, a inne zmienne są pomocnicze - przykładowo coś wyliczają z danych pobranych z bazy, i nie chcę tego wyliczenia trzymać w bazie danych, albo robić specjalnie dodatkowej klasy agregującej, bo tutaj się nic nie agreguje z innych relacji.

Kiedy dostaję obiekt z ORMa Phalcona to nie jest on klasy stdClass tylko klasy \k3\product\EntityProduct, z wypełnionymi polami tymi które są skojarzone z bazą danych.

I teraz jeżeli ktoś twierdzi, że w encji powinny być tylko i wyłącznie zmienne skojarzone z bazą, i nic więcej, i to służy tylko do komunikacji z bazą danych, to niestety jest w błędzie, przynajmniej jeżeli chodzi o DDD, bo być może w filozofii Doctrine/Symfony to jest prawidłowe(?).

0

Dodanie pola klasy to dosc banalna sprawa. Cos bardziej zastanawiam sie na srodowiskiem etc. Sam projekt jest na dockerze, moze tutaj cos kuleje?

0

KOSZ Prosze. @Patryk27

1 użytkowników online, w tym zalogowanych: 0, gości: 1