Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Doctrine-orm] Mapowanie i association-mapping
Forum PHP.pl > Forum > Przedszkole
twojastara
Dokumentacja mówi, że jeśli w klasie Entity dodaję właściwości

np.
  1. /** @Column(type="integer") */
  2. private $id;
  3. /** @Column(length=140) */
  4. private $text;
  5. /** @Column(type="datetime", name="posted_at") */
  6. private $postedAt;

To po wydaniu komendy doctrine:generate:entities i doctrine:schema:update
w bazie powstaną kolumny id, text i postedAt

A czy ten zapis też stworzy kolumnę (panstwa)?
  1. /**
  2. * @ORM\OneToMany(targetEntity="Panstwo", mappedBy="kontynent")
  3. */
  4. protected $panstwa;


Bo dokumentacja mówi że taki zapis
  1. /** @Entity **/
  2. class Product
  3. {
  4. // ...
  5.  
  6. /**
  7.   * @OneToOne(targetEntity="Shipping")
  8.   * @JoinColumn(name="shipping_id", referencedColumnName="id")
  9.   **/
  10. private $shipping;
  11.  
  12. // ...
  13. }
  14.  
  15. /** @Entity **/
  16. class Shipping
  17. {
  18. // ...
  19. }


wygeneruje taki schema
  1. CREATE TABLE Product (
  2. id INT AUTO_INCREMENT NOT NULL,
  3. shipping_id INT DEFAULT NULL,
  4. UNIQUE INDEX UNIQ_6FBC94267FE4B2B (shipping_id),
  5. PRIMARY KEY(id)
  6. ) ENGINE = InnoDB;
  7. CREATE TABLE Shipping (
  8. id INT AUTO_INCREMENT NOT NULL,
  9. PRIMARY KEY(id)
  10. ) ENGINE = InnoDB;
  11. ALTER TABLE Product ADD FOREIGN KEY (shipping_id) REFERENCES Shipping(id);

czyli nie tworzy kolumny `shipping`
ohm
No nie tworzy, bo to jest tylko relacja, więc tworzy kolumnę na podstawie joina czyli shipping_id połączone kluczem z shipping.id
ohm
  1. @ORM\JoinColumn(name="idZamowienie", ...)

Na podstawie tego zostaje utworzona nowa kolumna idZamowienie
twojastara
jeszcze jedno.

Czy ten zapis powoduje stworzenie jakiejś kolumny?
  1. class Kontynent
  2. {
  3. ...
  4. /**
  5. * @ORM\OneToMany(targetEntity="Panstwo", mappedBy="kontynent")
  6. */
  7. protected $panstwa;
  8. ...
  9. }


bo książki piszą, że w relacji 1:1, zapis:
  1. @ORM\OneToOne(targetEntity="Profil")

jest równoważny z tym:
  1. @ORM\OneToOne(targetEntity="Profil")
  2. @ORM\JoinColumn(name="profil_id", referencedColumnName="id")

No to jeśli równoważny to pierwszy zapis też powinien tworzyć kolumnę. A skoro tak, to niby na podstawie czego stworzy tę kolumnę i jak ją niby nazwie?

--------------------------------------------------------
i osobne pytanie

mając wygenerowany fragment klasy Zamowienie, na podstawie importu bazy danych (komenda doctrine:mapping:import)
  1.  
  2. #Zamowienie.php
  3. /**
  4.   * @var \AppBundle\Entity\Klient
  5.   *
  6.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Klient")
  7.   * @ORM\JoinColumns({
  8.   * @ORM\JoinColumn(name="idKlient", referencedColumnName="idKlient")
  9.   * })
  10.   */
  11. private $idklient;


chcę dodać brakujące adnotacje OneToMany i zmodyfikowac powyższą adnotację o `inversedBy` bo ta komenda nie generuje tego automatycznie (piszą o tym w dokumentacji że trzeba to zrobić ręcznie).

Więc dodaję do klasy odwrotnej relacji (inverse side) ten fragment by miec OneToMany
  1. /**
  2.   * @ORM\OneToMany(targetEntity="Zamowienie", mappedBy="klient")
  3.   */
  4. protected $zamowienia;

i modyfikuję fragment klasy właściciela relacji o inverseBy
  1. /**
  2.   * @var \AppBundle\Entity\Klient
  3.   *
  4.   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Klient", inversedBy="zamowienia")
  5.   * @ORM\JoinColumns({
  6.   * @ORM\JoinColumn(name="idKlient", referencedColumnName="idKlient")
  7.   * })
  8.   */
  9. private $klient;

czy poprawnie dobrałem nazwy właściwości i wartości: mappedBy i inversedBy? Czy nazwy właściwości mogę sobie dobrać z kosmosu czy maja one odpowiadać nazwą kolumn?
ohm
doctrine:schema:validate wszystko Ci powie na temat relacji wink.gif

Ogólnie przy OneToMany, o ile pamięć mnie nie myli, to tworzony jest tylko klucz obcy na kolumnie id powiązany z tą kolumną z drugiej strony, czyli x_id (czyli relacja cos.id cos_innego.cos_id)
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.