Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ORM] Jak prawidłowo powiązać encje?, Klucze obce i nazewnictwo
WebCM
post
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Istnieją następujące tabele w bazie:

FILMY
- ID
- tytul

AKTORZY
- ID
- film (klucz obcy do FILMY.ID)
- imie

Załóżmy następujące klasy:
  1. class Film
  2. {
  3. public $id;
  4. public $tytul;
  5. }
  6. class Aktor
  7. {
  8. public $id;
  9. public $film; //niektóre ORM używają __get(), więc musi być private/protected
  10. public $imie;
  11. }

Chcę napisać kod zgodny z przyjętymi zasadami i jednocześnie czytelny. Powstają pytania:

1. Jak nazwać kolumny, które są kluczami obcymi?

Najłatwiej nazwać kolumnę film, ale nie wszystkie ORM sobie z tym poradzą ze względu na konflikt nazw.

  1. <?php
  2. $wartosc = $aktor->film->tytul;
  3.  
  4. // jeśli pole $film jest publiczne, wystąpi błąd, bo $film zawiera ID filmu
  5. // jeśli pole $film jest prywatne, otrzymamy tytuł filmu, jeśli ORM sobie poradzi
  6. ?>

2. Czy do klasy encji powinien trafić także ID powiązanego rekordu?

  1. class Aktor extends Encja
  2. {
  3. public $ID;
  4. public $filmid; //zakładając, że nazwa kolumny w bazie to filmid
  5. public $imie;
  6. private $film; //pole w zasadzie zbędne, to tylko informacja dla IDE
  7.  
  8. //Niektóre ORM-y wymagają zdefiniowania powiązań między encjami
  9. public function inicjuj()
  10. {
  11. $this->nalezyDo('filmid', Film::class, 'ID'); //pole filmid odwołuje się do ID encji Film
  12. }
  13.  
  14. //A także trzeba podać nazwę tabeli
  15. public function nazwaTabeli() { return 'AKTORZY'; }
  16. }

Zamiast funkcji można użyć także adnotacji lub pliku konfiguracyjnego. Przykład wyżej ma pole $filmid, ale do relacji odwołujemy się poprzez metodę magiczną __get(). Czy to zbyt nie komplikuje kodu? Może większość bibliotek ORM od razu pobiera powiązane encje n:1. Czy w powyższym przypadku po odwołaniu do $filmid (lub $film z poprzednich przykładów) powinniśmy otrzymać ID filmu czy obiekt klasy Film?

PS. Co myślicie o potworkach typu Film::find()?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Miało być: [...] tworzą relację wiele-do-wielu, NIE wiele-do-jednego..

Żeby było dobrze powinno być:
  1. class Film {
  2. private $id; // id
  3.  
  4. private $title; // string
  5.  
  6. private $actors; // array[Actor], czy jakaś obiektowa kolekcja, np. ArrayColection[Actor] z Doctrine
  7. }
  8.  
  9. class Actor {
  10. private $id;
  11.  
  12. private $firstName;
  13. private $lastName;
  14.  
  15. private $films; // ponownie, tablica/kolekcja jednak tym razem obiektów Film
  16. }
Do tego, każda z tych klas powinna mieć zestaw funkcji get/set/has/add/etc dla każdej z właściowości.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 28.12.2025 - 07:57