Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Doctrine. Czy mając obiekt Zamowienie mogę bez pętli wyciągnąć wszystkie jego produkty gdy jest relacja OneToMany?
porzeczki
post 15.10.2016, 16:14:15
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Zamówienie składa się z wielu ZamowienieProdukt. Czy mając obiekt Zamowienie mogę bez pętli wyciągnąć wszystkie jego produkty gdy jest relacja OneToMany? Bo poniższy sposób zwraca pustą zmienną $produkty

  1. //Kontroler
  2. $zamowienie = $this->getDoctrine()
  3. ->getRepository('AppBundle:Zamowienie')
  4. ->find(157);
  5. $produkty = $zamowienie->getZamowienieProdukty();






  1. /**
  2.  * @ORM\Table(name="zamowienie", indexes={@ORM\Index(name="idKlient_idx", columns={"idKlient"}), @ORM\Index(name="idStatus_idx", columns={"idStatus"})})
  3.  * @ORM\Entity(repositoryClass="AppBundle\Repository\ZamowienieRepository")
  4.  */
  5. class Zamowienie
  6. {
  7.  
  8. ...
  9.  
  10.  
  11. /**
  12.   * @ORM\OneToMany(targetEntity="ZamowienieProdukt", mappedBy="idzamowienie")
  13.   */
  14. protected $zamowienie_produkty;
  15.  
  16.  
  17. /**
  18.   * @return \Doctrine\Common\Collections\Collection
  19.   */
  20. public function getZamowienieProdukty()
  21. {
  22. return $this->zamowienie_produkty;
  23. }



  1. /**
  2.  * @ORM\Table(name="zamowienie_produkt", indexes={@ORM\Index(name="idZamowienie_idx", columns={"idZamowienie"}), @ORM\Index(name="isbn_idx", columns={"isbn"})})
  3.  * @ORM\Entity
  4.  */
  5. class ZamowienieProdukt
  6. {
  7.  
  8.  
  9. /**
  10.   * @var \AppBundle\Entity\Ksiazka
  11.   *
  12.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Ksiazka", inversedBy="zamowienie_produkty")
  13.   * @ORM\JoinColumns({
  14.   * @ORM\JoinColumn(name="isbn", referencedColumnName="isbn")
  15.   * })
  16.   */
  17. private $isbn;
  18.  
  19.  
  20. /**
  21.   * @var \AppBundle\Entity\Zamowienie
  22.   *
  23.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Zamowienie", inversedBy="zamowienie_produkty")
  24.   * @ORM\JoinColumns({
  25.   * @ORM\JoinColumn(name="idZamowienie", referencedColumnName="idZamowienie")
  26.   * })
  27.   */
  28. private $idzamowienie;


(nie wiem, może to pytanie wyjątkowo durne, ale ciężko mi czasem rozpoznać co dzieje się magicznie bez mojej wiedzy, a o co muszę sam zadbać)


---edit----

czy to trzeba takie cholerstwo konstruować z 6 metodami, czy ten człowiek robi to tak jak należy, czy jest jakiś prostszy sposób?

  1. /**
  2.  * @ORM\Entity
  3.  */
  4. class User extends BaseUser
  5. {
  6.  
  7. /**
  8.   * @var Collection
  9.   * @ORM\OneToMany(targetEntity="AppBundle\Entity\Employee", mappedBy="user", cascade="persist")
  10.   */
  11. protected $employees;
  12.  
  13.  
  14.  
  15. public function __construct()
  16. {
  17. $this->employees = new \Doctrine\Common\Collections\ArrayCollection();
  18. parent::__construct();
  19. }
  20.  
  21.  
  22. public function prePersist($user)
  23. {
  24. parent::prePersist($user);
  25. $user->setEmplolyees($user->getEmployees());
  26. }
  27.  
  28. public function preUpdate($user)
  29. {
  30. parent::preUpdate($user);
  31. $user->setEmplolyees($user->getEmployees());
  32. }
  33.  
  34. /**
  35.   * Add employees
  36.   *
  37.   * @param \AppBundle\Entity\User $employee
  38.   * @return Organisation
  39.   */
  40. public function addEmployee(\AppBundle\Entity\User $employee)
  41. {
  42. $employee->setOrganisation($this);
  43. $this->employees[] = $employee;
  44.  
  45. return $this;
  46. }
  47.  
  48.  
  49. function setEmployees($employees)
  50. {
  51. foreach ($employees as $employee)
  52. {
  53. $this->addEmployee($employee);
  54. }
  55. }
  56.  
  57. /**
  58.   * Remove employee
  59.   *
  60.   * @param \AppBundle\Entity\User $employee
  61.   */
  62. public function removeEmployee(\AppBundle\Entity\User $employee)
  63. {
  64. $this->employees->removeElement($employee);
  65. }
  66.  
  67. /**
  68.   * Get employees
  69.   *
  70.   * @return \Doctrine\Common\Collections\Collection
  71.   */
  72. public function getEmployees()
  73. {
  74. return $this->employees;
  75. }
  76. }


Ten post edytował porzeczki 15.10.2016, 21:49:44
Go to the top of the page
+Quote Post
kpt_lucek
post 16.10.2016, 06:01:16
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Primo: stostuj angielskie nazewnictwo, przede wszystkim dlatego, że bardzo dziwnie wygląda "getZamowienieProdukty"
Secondo: Uprość nazewnictwo i mapowania
  1. /**
  2.  * @ORM\Table(name="zamowienie_produkt", indexes={@ORM\Index(name="idZamowienie_idx", columns={"idZamowienie"}), @ORM\Index(name="isbn_idx", columns={"isbn"})})
  3.  * @ORM\Entity
  4.  */
  5. class ZamowienieProdukt
  6. {
  7.  
  8.  
  9. /**
  10.   * @var \AppBundle\Entity\Ksiazka
  11.   *
  12.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Ksiazka", inversedBy="zamowienie_produkty")
  13.   * @ORM\JoinColumn(referencedColumnName="isbn")
  14.   */
  15. private $isbn; // <- pointujesz do "Ksiazka" a zmienna to "isbn" niejednoznaczne :c
  16.  
  17.  
  18. /**
  19.   * @var \AppBundle\Entity\Zamowienie
  20.   *
  21.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Zamowienie", inversedBy="zamowienie_produkty")
  22.   * @ORM\JoinColumn(referencedColumnName="idZamowienie") <- zamiast stosowac nazewnictwo id{NazwaKlasy} możesz to uprościć do zwykłego "id"
  23.   */
  24. private $zamowienie;


Terzo:
W przypadku OneToMany i Doctrine, dobrze jest inicjować obiekt (encję) wraz z konstruktorem, dzięki temu nie powinieneś mieć problemu z nullem:

  1. /**
  2.  * @ORM\Table(name="zamowienie", indexes={@ORM\Index(name="idKlient_idx", columns={"idKlient"}), @ORM\Index(name="idStatus_idx", columns={"idStatus"})})
  3.  * @ORM\Entity(repositoryClass="AppBundle\Repository\ZamowienieRepository")
  4.  */
  5. class Zamowienie
  6. {
  7.  
  8. public function __construct()
  9. {
  10. $this->zamowienie_produkty = new ArrayCollection();
  11. }
  12.  
  13.  
  14. /**
  15.   * @ORM\OneToMany(targetEntity="ZamowienieProdukt", mappedBy="idzamowienie")
  16.   */
  17. protected $zamowienie_produkty;
  18.  
  19.  
  20. /**
  21.   * @return \Doctrine\Common\Collections\Collection
  22.   */
  23. public function getZamowienieProdukty()
  24. {
  25. return $this->zamowienie_produkty;
  26. }


Quarto:

php (<3.0) app/console doctrine:schema:validate
php (3.0 =<) bin/console doctrine:schema:validate


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
porzeczki
post 16.10.2016, 13:40:20
Post #3





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


i wg powyższego, poniższe powinno zwracać wszystkie produkty zamówienia?
  1. $produkty= $this->getDoctrine()->getRepository('AppBundle:Zamowienie')->find(2)->getZamowienieProdukty();

(.. bo nie zwraca.)
Go to the top of the page
+Quote Post
kpt_lucek
post 16.10.2016, 16:14:00
Post #4





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


A w bazie na pewno masz dodane wpisy? smile.gif


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
porzeczki
post 17.10.2016, 19:25:05
Post #5





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


działa. (miałem błąd niezwiązany z tematem, powiedzmy)



Ten post edytował porzeczki 17.10.2016, 23:46:28
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 00:20