• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego encja zwraca mi dosłownie wszystko? [Doctrine][PHP]

Object Storage Arubacloud
0 głosów
317 wizyt
pytanie zadane 3 stycznia 2017 w PHP przez HaKIM Szeryf (87,590 p.)
edycja 3 stycznia 2017 przez HaKIM

Hej!

Podczas wywoływania takiego kodu:

        $resource = new Resource($this->container->get('entityManager'));
        $monster = $resource->find('one', 'Entity\Monster\Monster', [
            'idMonster' => 1
        ]);

       var_dump($monster->getAttribute());

Z encji:

/**
 * @ORM\Entity
 * @ORM\Table(name="monster")
 */
class Monster extends Entity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $idMonster;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nameMonster;

    /**
     * @ManyToOne(targetEntity="Entity\Attribute\Attribute")
     * @JoinColumn(name="idAttribute", referencedColumnName="idAttribute")
     */
    private $attribute;

    public function getArrayCopy(): array
    {
        return get_object_vars($this);
    }

    public function getNameMonster(): string
    {
        return $this->nameMonster;
    }

    public function getAttribute(): Attribute
    {
        return $this->attribute;
    }
}

Zostaje mi zwrócony jakby cały doctrine. Wraz z hasłem, loginem do bazy i pierdyliard innymi rzeczami od doctrine. Nie rozumiem dlaczego.

Encja Attribute:

/**
 * @ORM\Entity
 * @ORM\Table(name="attribute")
 */
class Attribute extends Entity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $idAttribute;

    /**
     * @ORM\Column(type="integer")
     */
    private $health;

    /**
     * @ORM\Column(type="integer")
     */
    private $strength;

    public function getArrayCopy(): array
    {
        return get_object_vars($this);
    }

    public function getHealth(): int
    {
        return $this->health;
    }

    public function getStrength(): int
    {
        return $this->strength;
    }
}

Ku mojemu większemu zdziwieniu wywołanie:

var_dump($monster->getAttribute()->getStrength());

Zwraca wartość w mgnieniu oka, nie wczytując już każdego z atrybutów doctrine.

Wie ktoś dlaczego tak się dzieje, czy będę musiał na własną rękę studiować dlaczego nie zwracam encji Attribute a cały Doctrine?

Dodam również niedokończoną metodę find:

    public function find(string $count, string $repository, array $arguments = []): Entity
    {
        switch ($count) {
            case 'one':
                $resource = $this->entityManager->getRepository($repository)->findOneBy($arguments);
                return $resource;
                break;
        }
    }

Gdyby był potrzebne dodatkowy kod, dajcie znać.

2 odpowiedzi

+1 głos
odpowiedź 3 stycznia 2017 przez maly Nałogowiec (37,190 p.)
wybrane 3 stycznia 2017 przez HaKIM
 
Najlepsza
Nie pamiętam jak to jest dokładnie ale zwrócony rezultat to nie cały Doctrine lub jak oczekujesz Monster tylko kolekcja na której możesz ponownie wykonać jakieś tam operacje(find, findOneBy, ...) których rezultatem będzie kolekcja na których możesz wykonać operacje których resultatem będzie... :)

Na tym właśnie polega ORM.
komentarz 3 stycznia 2017 przez HaKIM Szeryf (87,590 p.)

Okej.

Spodziewałem się, że zostanie mi zwrócona wyłącznie encja Attribute, na której będę mógł operować. W sumie to tak działa, acz, nie spodziewałem się tak wielkiego wyniku.

Nie pamiętam jak to jest dokładnie ale zwrócony rezultat to nie cały Doctrine 

Polemizowałbym. Wydaje mi się, że w zwróconym wyniku jest zawarty każde z danych, które przechowuje Doctrine.

https://gyazo.com/dd74abba1789d8356263712b19842b38

komentarz 3 stycznia 2017 przez maly Nałogowiec (37,190 p.)
Ok, rzeczywiście wygląda jakby to był cały Doctrine, ale jak napisałem "Nie pamiętam jak to jest dokładnie" no i nigdy nie próbowałem var_dump-nąć rezultatu.
Pytanie czy to w czymś przeszkadza?
komentarz 3 stycznia 2017 przez HaKIM Szeryf (87,590 p.)
Nie, nie. Póki śmiga szybko - to nie problem.

Czysta ciekawość. :)
komentarz 3 stycznia 2017 przez Boshi VIP (100,240 p.)
Swoją drogą czemu takie kombinacje tworzysz z tą metodą find i co to jest za obiekt resource?
komentarz 3 stycznia 2017 przez HaKIM Szeryf (87,590 p.)
Na wpół tworzyłem z tutorialem do doctrine w slim a na wpół z dokumentacji. Początkowo resource był klasą abstrakcyjną po której dziedziczyły klasy robiące to samo co find, ale wyspecjalizowane w jednej klasie. Mówiąc inaczej: 1 encja 1 resource. IMO jest to cholernie powtarzalna czynność, więc na szybko zmieniłem Resource aby mógł obsłużyć zapytanie find, lub inne, do każdej z podanych encji.
0 głosów
odpowiedź 3 stycznia 2017 przez efiku Szeryf (75,160 p.)
CZEMU

nie możesz tego zrobić .. normalnie?

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#custom-repositories

Słowo klucz: Doctrine repositories
komentarz 4 stycznia 2017 przez HaKIM Szeryf (87,590 p.)

Tiaaa... Tak coś czułem, że gość tworzący ten kurs robi coś nie tak (Brak mi było tam miejsca dla modelu). 

Dzięki, czegoś takiego mi było trzeba. To ja lecę refaktoryzować kod i uczyć się DQLa.

Podobne pytania

0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 9 listopada 2017 w JavaScript przez DariuszH Gaduła (3,100 p.)
0 głosów
0 odpowiedzi 386 wizyt
pytanie zadane 16 grudnia 2017 w PHP przez Radax Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 180 wizyt
pytanie zadane 22 listopada 2017 w PHP przez Assasz Nałogowiec (30,460 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...