Wpis z mikrobloga

#symfony #symfony2
mam pytanie o #doctrine... wciąż jeszcze nie ogarniam relacji #manytoone czy #onetomany... dlaczego chciałem was prosić o pomoc :)

Powiedzmy że mam trzy encje, żeby to uprościć posłużę się przykładem z komunikacji miejskiej:
Encje:
- busStop
- timeTable
- arrivals

Relacje powinny być takie:
busStop może mieć wiele timeTable
timeTable może mieć jednen busStop oraz wiele arrivals
arrivals może mieć jeden timeTable
Czy ktoś mógłby podać przykład jak powinno to być zmapowane? :(

Czy tak jest dobrze?
http://pastebin.com/KKdJCjYv
  • 15
@qwelukasz: Chodzi mi co chcesz tam rzeczywiście przechowywać. Tj jakie informacje przechowuje ta tabela. Arrivals - to przyjazdy jak rozumiem. a co w timeTable. Jak czas jest oderwany od przyjazdów? ;)
@ghost1511: poniewaz jeden przystanek może mieć kilka różnych tabliczek (z uwagi na to że do przystanku należy kilka różnych linii autobusowych).
Więc wymyśliłem to sobie tak że przystanek może mieć różne tabliczki które mają inne godziny odjazdów
@qwelukasz: OK. Ale masz źle znormalizowany schemat. Dochodzi do redundancji danych.
Dodając do tego linie autobusowe wygląda to mniej więcej tak: Arrivals(BusStopId, LineId, Time)
I teraz mając BusStopId możesz sprawdzić jakie linie tam idą i o której godzinie ( informacje z tabliczki ) a czas jest w jednym miejscu.
@ghost1511: ok, dzisiaj juz chyba nie bede mial czasu do tego usiasc ale w przyszlym tygodniu to zmienię.
Jeszcze powiedz mi jak później z encji busstop mogę odwołać się do godzin odjazdu dla danej linii?

busstop->getArrivals()
i potem pętlą sprwadzam czy busstop->getArrivals()->getLineId() jest równe aktualnej linii?
(pomijam oczywiście możliwość puszczenia selecta do bazy z busstopip oraz lineid)
@qwelukasz: Zaletą doctrine jest to, że to może działać dwustronnie. Czyli mając daną linię (po id) możesz odwołać się do jej obiektów czyli $line->getArrivals() mając dany przystanek też pobierzesz odjazdy za pomocą $busStop->getArrivals()
@ghost1511: tak ale robiąc
$busStop->getArrivals() pobiorę wszystkie godziny odjazdów dla tego przystanku (w tym dla wszystkich linii które się tam zatrzymują)
a zrobić coś takiego żeby przy pomocy
$busStop->getArrivals() dostać godziny odjazdu dla tego przystanku gdzie LineId = 1?
W tabeli Arrivals kluczem powinno być (przy bardzo prostym założeniu, że godziny odjazdów się nie zmieniają/nie są trzymane historycznie) (idBusStop, idLine) więc żeby wyszukać arrival powinieneś podać te wartości jako klucz. Ogólnie jeżeli masz dobrze zdefiniowaną relację to resztę na pewno da się zrobić ;)