Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak w ogóle wygenerować te modele w Doctrine2?
Forum PHP.pl > Forum > PHP > Object-oriented programming
michael1986
Witam

Do generowanie modeli służy komenda w konsoli:

doctrine orm:generate-entities models


models to mój folder

no nie?

ale zawsze zwraca wynik mi:

No Metadata Classes to process.

ale skąd te dane gdzie mam wrzucić?


PROSTE DZIAŁANIE GENERATORA:

wrzucam w folder A, pisze komendę mam w folderze B. To powinno być opisane na głownej stronie doctrine, NIE MA TEGO NIGDZIE W INTERNECIE!!!

PYTANIE OCZYWISTE MOJE JEST GDZIE WRZUCIC TE PLIKI?

oczywiscie chodzi mi o generawanie z xml lub yaml (obojetnie niech chociaz jeden dziala).


GDZIE WRZUCIC TE PLIKI I JAK TO GENEROWAC PYTANIE JEST PROSTE?
destroyerr
Cytat
To powinno być opisane na głownej stronie doctrine,

Po co na głównej, od razu niech to wrzucą zamiast loga (przecież to ich psi obowiązek), nie będziesz musiał się już wysilać.

Cytat
NIE MA TEGO NIGDZIE W INTERNECIE!!!

To dziwne, bo np. na stronie doctrine jest dokumentacja a w niej opis jak należy skonfigurować. My niestety nie wiemy jak Ty skonfigurowałeś, więc jak mamy Ci pomóc?
michael1986
Cytat(destroyerr @ 4.01.2012, 15:15:24 ) *
Po co na głównej, od razu niech to wrzucą zamiast loga (przecież to ich psi obowiązek), nie będziesz musiał się już wysilać.


To dziwne, bo np. na stronie doctrine jest dokumentacja a w niej opis jak należy skonfigurować. My niestety nie wiemy jak Ty skonfigurowałeś, więc jak mamy Ci pomóc?


domyslnie mi sie zainstalowalo. pierwsza sprawa czy encje generuje poleceniem w konsoli czy jakos przez php musze to robic? (wiem ze i tak polecenie z konsoli korzysta z php, ale skoro jest generator na konsoli to chyba powinien miec funkcje generowania klas php)? Teraz moge wygenerowac proxy, ale encji nie moge. Czy ja dobrze mysle ze do generowania encji sluzy polecenie

doctrine orm:generate-entities Entities

zapewne dobrze. To czemu po usunieciu wszystkeigo z folderu Entities nie generuje mi encji tylko wypisuje durny komunikat

No Metadata Classes to process.

przeciez powinien sobie ladnie zassac z folderu encji w XML YAML i wygenerowac. Przeciez generator kazdy, czegokolwiek dziala na zasadzie IN -> generator -> OUT czemu nigdzie nie pisze co jest IN co jest generator a co jest OUT?



a znacie jakiś DZIAŁAJACY tutorial do doctrine2? Działający tzn jak mam klase np Bugs (czesto takie sa w tutorialu) to jak dodam inne pola np:

test
debilnepole
costam

to on mi te pola wgeneruje w klasy? Bo przeciez do tego to sluzy?


do tej pory pobralem wszystkie klasy i albo nie wiem co zmodyfikowac, modyfikuje i pliki yaml i xml i sql... i zawsze jest to samo co bylo na poczatu czyli moich dolozonych pol nie robi wogule? co z tym jest? przeciez to nie dziala jakby nie patrzec na to
adbacz
Cytat
a znacie jakiś DZIAŁAJACY tutorial do doctrine2? Działający tzn jak mam klase np Bugs (czesto takie sa w tutorialu) to jak dodam inne pola np:

test
debilnepole
costam

to on mi te pola wgeneruje w klasy? Bo przeciez do tego to sluzy?

Że co? Że pola (właściwości) mają być osobnymi klasami? Z tego co wiem (używam Doctrine w Symfony2), to jedna klasa powinna obsługiwac jedną tabelę w bazie danych, czyli zawierać prywatne właściwości (tutaj: pola) oraz metody gettery i settey, i nic więcej. Nie wiem skąd Ci się wzięły te klasy - możesz wytłumaczyć?
Niktoś
Kurs ortografii bo w ogóle przez "ó" się pisze ,a ty drugi raz popełniłeś tego babola.
Zobacz jak działa prosta klasa napisana według wzorca singelton ,może to ciebie naprowadzi.
destroyerr
Cytat
Zobacz jak działa prosta klasa napisana według wzorca singelton ,może to ciebie naprowadzi.

Na co to może go naprowadzić? Przecież to nie ma związku.
michael1986
udało mi się wygenerować klasy: potem napiszę jak to zrobić. Ale już 1,5 dnia siedzę bez przerwy bo nie działa mi ESENCJA. Czyli (korzystając z przykładowym klas cookbook) robię tak:


  1.  
  2. $qb = $em->createQueryBuilder();
  3. $qb->add('select', 'u')
  4. ->add('from', 'Entities\User u');
  5.  
  6. $query = $qb->getQuery();
  7.  
  8. foreach ($result as $user) {
  9.  
  10. $reportedBugs = $user->getReportedBugs();
  11.  
  12. print_r( $reportedBugs );
  13.  
  14. }
  15.  
  16.  


i ten print_r zamiast pustej bądź pełnej kolekcji błędów zwraca mi jakiś obiekt "PersistentCollection" który mimo że ma dobrych pare KB to nie zawiera ŻADNYCH pożytecznych informacji.

To jest esencjalna funkcja i MUSI działać. Co robię nie tak?


Przy dodawaniu obiektu robię tak:

  1.  
  2. $bug = new Entities\Bug();
  3.  
  4. $user->addBug($bug);
  5.  
  6. $em->persist($bug);
  7.  
  8. $reportedBugs = $user->getReportedBugs();
  9. echo($reportedBugs->toArray());
  10.  
  11.  


i tu mi ładnie odczytuje. Ale przecież doctrine nie służy do mapowania obiektów w pamięci a do zapisywania/czytania z bazy. Ludzie to jest esencja i to jest skandal żeby to nie działało.

Czego oczekuje (chyba kazdy się domyśla): błędów użytkownika w arrayu lub podobnym obiekcie.

Aha i oczywiście oczekuję żeby dało się ALBO załadować (zmapować) od razu wszystko, albo tylko nie które obiekty na rządanie, to chyba jasne no nie?
adbacz
Po pierwsze: jaka "esencja"?
Po drugie: Z tego co wiem po użytkowaniu Doctrine w Symfony2 to musisz każdy nowo dodawany obiekt przepuścić przez metodę $em->persist(), oraz później wywołać metodę $em->flush(). Nie wiem czy tak jest w czystym Doctrine więc nie będę się kłócił.
Po trzecie: Ten obiekt PersistentCollection wg mnie to właśnie ma coś związanego z tą metodą persist co napisałem wyżej.

Wydaje mi się, że nie do końca przeczytałeś dokumentację, i próbujesz "przekształcić" lub "dostosować" Doctrine do swojego toku myślenia. Niestety musze Ci powiedzieć, że to Ty musisz się nauczyć korzystać z Doctrine jak z każdego innego narzędzia. Nic samo nie przychodzi, i nie pisz takich rzeczy jak "Ludzie to jest esencja i to jest skandal żeby to nie działało." bo to troszkę parodią jedzie.

Nie chcę Cię obrażać czy coś, ale po prostu takie jest moje zdanie. Przeczytaj dokłądnie dokumentację (z tego co widziałem to jest bardzo dobrze napisana) i dopiero w tedy pisz: "tak jest w dokumentacji ale mi nie działa".
michael1986
Cytat(adbacz @ 9.01.2012, 20:09:13 ) *
Po pierwsze: jaka "esencja"?
Po drugie: Z tego co wiem po użytkowaniu Doctrine w Symfony2 to musisz każdy nowo dodawany obiekt przepuścić przez metodę $em->persist(), oraz później wywołać metodę $em->flush(). Nie wiem czy tak jest w czystym Doctrine więc nie będę się kłócił.
Po trzecie: Ten obiekt PersistentCollection wg mnie to właśnie ma coś związanego z tą metodą persist co napisałem wyżej.

Wydaje mi się, że nie do końca przeczytałeś dokumentację, i próbujesz "przekształcić" lub "dostosować" Doctrine do swojego toku myślenia. Niestety musze Ci powiedzieć, że to Ty musisz się nauczyć korzystać z Doctrine jak z każdego innego narzędzia. Nic samo nie przychodzi, i nie pisz takich rzeczy jak "Ludzie to jest esencja i to jest skandal żeby to nie działało." bo to troszkę parodią jedzie.

Nie chcę Cię obrażać czy coś, ale po prostu takie jest moje zdanie. Przeczytaj dokłądnie dokumentację (z tego co widziałem to jest bardzo dobrze napisana) i dopiero w tedy pisz: "tak jest w dokumentacji ale mi nie działa".



przepuszczenie usera przez ten persist nic nie daje. To co Ty mowisz to chyba przy dodawaniu do bazy tak? A jak czytać no jak? W dokumentacji nie ma takich "skomplikowanych" przykładów.

Dalej nie mogę odczytać żadnych poobiektów mojego obiektu żadną metodą: całe to doctrine jest kompletnie bez tego nieprzydatne.
adbacz
Napisz dokładnie co chcesz zrobić. Tylko pobrać usera z bazy? Kożystasz z repozytoriów Doctrine? Jeśli tak to:

1. Pobierasz (przypisujesz) EntityManager do zmiennej (nie wiem jak ale w dokumentacji na pewno jest wzmianka o tym)
2. Pobierasz repozytorium: getRepository('NazwaRepo');
3. W zależności od tego co chcesz pobobrać masz kilka możliwości ale standardowo można po ID, więc: findById($id);

I to raczej powinno działać z tego co widze w dokumentacji (cookbook), ale upierać się nie będę bo całej nie czytałem nigdy.
michael1986
1. zrobiłem
2. nie wiem o co chodzi

mam tablice User i Bugs (to przykład z cookbook), dodawanie działa

do odczytywania coś takiego stosuje:

  1.  
  2. $qb = $em->createQueryBuilder();
  3. $qb->add('select', 'u')
  4. ->add('from', 'Entities\User u');
  5.  
  6. $query = $qb->getQuery();
  7.  
  8. foreach ($result as $user) {
  9.  
  10. $reportedBugs = $user->getReportedBugs();
  11.  
  12. print_r( $reportedBugs );
  13.  
  14. }
  15.  


no i nie mogę uzyskać podobiektów czyli w tym przypadku $reportedBugs, próbówalem również

  1.  
  2. $query = $em->createQuery('SELECT u FROM Entities\User u JOIN u.reportedBugs r');
  3.  


też nic, poprostu potrafi zapisać podobiekty ale nie potrafi ich przeczytać za nic. To jest podstawa. A nie działa.
adbacz
A zobacz tak:
  1. $result = $em->createQuery('SELECT u FROM Entities\User)->getResult();


W zmiennej $result teraz powinieneś mieć tablicę z obiektami wszystkich użytkowników.

Repozytorium to nic innego jak zwykła klasa z polami prywatnymi, getterami i setterami, która odpowiada jednej tabeli w bazie danych. Wszystko jest opisane w dokumentacji Doctrine.
destroyerr
Dlaczego uważasz, że nie możesz uzyskać podobiektów? Przecież możesz! W Doctrine2 do przechowywania kolekcji obiektów są używane kolekcje, możesz po nich iterować, wybierać konkretne elementy, zrzucać do tablicy (jak już sam zauważyłeś) i wiele innych. Znajdziesz wszystko w dokumentacji, tylko trzeba czytać, a nie działać na oślep.
michael1986
Cytat(adbacz @ 10.01.2012, 08:21:55 ) *
A zobacz tak:
  1. $result = $em->createQuery('SELECT u FROM Entities\User)->getResult();


W zmiennej $result teraz powinieneś mieć tablicę z obiektami wszystkich użytkowników.

Repozytorium to nic innego jak zwykła klasa z polami prywatnymi, getterami i setterami, która odpowiada jednej tabeli w bazie danych. Wszystko jest opisane w dokumentacji Doctrine.



teraz zaczęły mi działać te "podobiekty" na jednej encji ale na drugiej nie: może ma uszkodzony model albo coś takiego. Pytanie czy dałoby się to zmapawać od razu? Tzn. żeby jak mam np. User i Product to żeby $user->getProducts() nie ładował produktów w chwiliwi wywołania ale żeby ładowało od razu te products. Teoretycznie coś takiego chyba umożliwia JOIN czy mam racje? Bo też badając czas wykonania getProducts() coś mi się wydaje że to nie działa. Ale czy dobrze rozumiem czy tak powininen działać JOIN?
adbacz
Z tego co zrozumiałem, to metodą getProducts() klasy User chcesz pobrać produkty? To trochę nie po kolei. Po to masz klasę Products i User (repozytoria), że każde z nich reprezentowało jedną tabelę. Możesz natomiast zrobić relację OneToMany dla klasy User pola products, i w tedy, jeśli wywołasz metodę getProducts() klasy User, to powinno Ci zwrócić rekordy, które są danego usera. Czyli produkty usera.

Mam nadzieję, że dobrze zrozumiałem twoją wypowiedź. Jak nie, to mnie popraw.

EDIT:
Cytat
Tzn. żeby jak mam np. User i Product to żeby $user->getProducts() nie ładował produktów w chwiliwi wywołania ale żeby ładowało od razu te products
Ja to zrozumiałem tak:
"Żeby $user->getProducts() nie zwracał produktów w chwili łądowania ale żeby ładował je od razu."
michael1986
zrobiłem własną bazę, sensowne relacje jedną z nich jest relacja Produkt (One) -> Cena (Many). Podany kod zwraca mi fajnie ceny:

  1.  
  2. $ceny = $product->getCeny();
  3.  



w różnych grupach cenowych. Mam długi listing produktów i chce pobrać ich wszystkie ceny. Obojętnie czy wpiszę:

  1.  
  2. $dql = "SELECT p FROM Entities\Product p";
  3.  
  4. $query = $em->createQuery($dql);
  5. $query->setMaxResults(1500);
  6.  


czy zamiast powyższego zapytania inne:

  1.  
  2. $dql = "SELECT p FROM Entities\Product p LEFT JOIN p.ceny c";
  3.  


czas budowania tabeli z cenami jest w przybliżeniu taki sam. Coś mi to nie pasuje. Bo moim zdaniem w pierwszym przypadku doctrine powinien dać 1 zapytanie do bazy o produkty i 1500 małych zapytań o ceny tych produktów. A w drugim zapytać o wszystko razem jednym zapytaniem, i wszystko od razu zmapować co powinno być finalnie szybsze. Czy ja źle pojmuję mechanizm JOIN w doctrine?

źle powiedziałem: źle działa LEFT JOIN, bo działa jak JOIN = jak nie ma rekordów w prawej tabeli to nie wypisuje rekordów w lewej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.