Tomasz
Wójtowicz
Programista Ruby on
Rails
Temat: Nadpisanie metody
Witam,Mam dwie tabele "Dane personalne" i "Adres". Są one powiązane ze sobą relacją jeden do wielu (jedna osoba -> wiele adresów). W tabeli adres mam kolumne ktora informuje czy jest to adres główny czy nie. Chcąc wyświetlić wszystkie osoby wraz z jego glównym adresem robie takie zapytanie:
$this->personal_datas = Doctrine_Core::getTable('PersonalData')
->createQuery('p')
->leftJoin('p.Address a')
->where('p.status = 1')
->andWhere('a.main = 1')
->groupBy('p.id')
->execute();
Wyswietlają mi się te osoby ktore są aktywne (status = 1) z jego glównym adresem(a.main = 1). I wlasnie kwestia jest tego typu, że jezeli mam w bazie zaznaczonych kilka głównych adresów to wyswietla się ten co został wprowadzony jako pierwszy. To jest do jeszcze do przelkniecia bo ktos zobaczy ze zly adres sie wyswietla jako ten glówny to sobie zmieni. Ale jest drugi problem. Jezeli nie ebdzie zaznaczony zaden adres, to w ogole nie wyswietli się osoba bo wedlug warunku musi miec adres glówny. I teraz nie wiem czy starac sie w kodzie zabiezpieczyc tak zeby do takich sytuacji nie dochodzilo czy jest na to jakis fajny sposob :D.
Zastanawialem się zeby robic zapytanie
$this->personal_datas = Doctrine_Core::getTable('PersonalData')
->createQuery('p')
->where('p.status = 1')
->execute();
i potem przy wyswietlaniu w widoku robić tak
$personal_data->Address[0]->address
$personal_data->Address[0]->zip_code ....
W ten sposob doctrine tworzy drugie zapytanie pobierajac adres danej osoby. Tyle ze pobiera pierwszy wiersz z bazy a nie ten wlasciwy :P. W jaki sposob mozna nadpisac to zeby przy wywolaniu $personal_data->Address pobieralo adres z moimi ograniczenami (czyli main = 1).
Tylko czy jest sens tak robic bo jak np bede chcial wyswietlic 50 osob to powstanie 100 zapytan do bazy :P Wiec to chyba jednak odpada hehe :P
BTW: Tak w ogole to nie wiem czy nazwa tematu jest odpowiednia do tego problemu ale widze ze juz nie moge go zmienicTomasz Wójtowicz edytował(a) ten post dnia 13.12.10 o godzinie 20:51