Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ORM] Jak prawidłowo powiązać encje?, Klucze obce i nazewnictwo
WebCM
post 3.12.2013, 00:44:01
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()?


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post

Posty w temacie


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: 23.06.2025 - 05:39