Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Doctrine 2.1 - relacja OneToMany oraz ściąganie danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jazi
Mam dwie klasy:

User:

  1. /** @Entity @Table(name="users") */
  2. class User {
  3. /**
  4.   * @Id @GeneratedValue @Column(type="integer")
  5.   * @var integer
  6.   */
  7. protected $id;
  8.  
  9. /**
  10.   * @Column(type="string", length=20, unique=TRUE)
  11.   * @var string
  12.   */
  13. protected $login;
  14.  
  15. /**
  16.   * @OneToMany(targetEntity="News", mappedBy="author")
  17.   */
  18. protected $news;
  19.  
  20. public function __construct() {
  21. $this->news = new \Doctrine\Common\Collections\ArrayCollection;
  22. }
  23. }


i News:

  1. /** @Entity @Table(name="news") */
  2. class News {
  3. /**
  4.   * @Id @GeneratedValue @Column(type="integer")
  5.   * @var integer
  6.   */
  7. protected $id;
  8.  
  9. /**
  10.   * @Column(type="string", length=100)
  11.   * @var string
  12.   */
  13. protected $title;
  14.  
  15. /**
  16.   * @Column(type="text")
  17.   * @var string
  18.   */
  19. protected $content;
  20.  
  21. /**
  22.   * @ManyToOne(targetEntity="User", inversedBy="news")
  23.   * @JoinColumn(referencedColumnName="id")
  24.   */
  25. protected $author;
  26. }


Czy po wykonaniu poniższego kodu

  1. $q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = '.$id);
  2. $user = $q->getSingleResult();


Doctrine ściągnie wszystkie aktualności (stworzone przez konkretnego użytkownika) z bazy danych?
elektrrrus
Dlaczego po prostu nie sprawdzisz? Byłoby szybciej niż pisac posta na forum.
Jazi
Eh, to pomocne podejście Polaków mnie rozwala biggrin.gif.

Chodzi mi o to, że jeśli skorzystam z ww. kodu, a nie będę miał zaincludowanej klasy News, to Doctrine wówczas wywali mi błąd, że taki model nie istnieje. Ciekawi mnie, czy Doctrine pobierałby aktualności automatycznie, czyli w momencie stworzenia obiektu przy pomocy ww. zapytania, czy w momencie, kiedy skorzystam z $user->getNews().

BTW. Czy istnieje jakiś sposób na pokazanie wygenerowanego SQL'a z createQuery()?
-=Peter=-
Cytat
Ciekawi mnie, czy Doctrine pobierałby aktualności automatycznie, czyli w momencie stworzenia obiektu przy pomocy ww. zapytania, czy w momencie, kiedy skorzystam z $user->getNews().

W obydwóch przypadkach nie zostaną zaciągnięte aktualności, aktualności zostaną zaciągnięte gdy wywołasz jakąś operację która wymaga fizycznie obiektów z kolekcji, np. metody z interfejsu iteratora (przejście przez pętle), czy metodę count (przy domyślnej konfiguracji relacji). Dodanie jakiegoś elementu do kolekcji również nie powoduje załadowania kolekcji, gdyż ta operacja nie wymaga tego aby kolekcja była zainicjalizowana.
michael1986
Cytat(-=Peter=- @ 15.12.2011, 19:51:26 ) *
W obydwóch przypadkach nie zostaną zaciągnięte aktualności, aktualności zostaną zaciągnięte gdy wywołasz jakąś operację która wymaga fizycznie obiektów z kolekcji, np. metody z interfejsu iteratora (przejście przez pętle), czy metodę count (przy domyślnej konfiguracji relacji). Dodanie jakiegoś elementu do kolekcji również nie powoduje załadowania kolekcji, gdyż ta operacja nie wymaga tego aby kolekcja była zainicjalizowana.



czyli konkretnie co trzeba zrobić żeby dane zostały zaciągnięte?
-=Peter=-
Np. iterowanie po kolekcji.
michael1986
Cytat(-=Peter=- @ 10.01.2012, 23:24:01 ) *
Np. iterowanie po kolekcji.


a jak zrobić taką iterację? Prosze o przykład, teraz użwam ->toArray i foreach po tablicy i wydaje mi się że jest to dość wolne.
-=Peter=-
A wiesz co to jest iterator? Jeśli nie wiesz to poczytaj o tym w manualu php i wiedz że interfejs Doctrine\Common\Collections\Collection (czyli pośrednio klasa ArrayCollection i PersistentCollection) rozszerza interfejs Iterator lub IteratorAggregate. A jeśli wydaje Ci się że wiesz co to jest iterator, to masz rację, tylko Ci się wydaje, bo w przeciwnym wypadku byś wiedział jak się iteruje po obiekcie.
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.