Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]zapytanie w Propel -- Symfony
Forum PHP.pl > Forum > PHP > Frameworki
mercii
Witam
Jestem początkujący jezeli chodzi o Symfony i ze takpowiem zawiesielem sie na zapytaniach do bazy.
Jak napisac takie zapytanie:
  1. SELECT a.imie, a.nazwisko, a.miasto, a.ulica, a.email, b.nazwa FROM klient a, firma b WHERE a.id=b.id;

?
Czytam tutoriale i dokumenatcje i nie moge tego zrozumiec albo znalesc.
Z gory dziekuje za pomoc.
Crozin
Symfony nie ma tu nic do rzeczy, więc możesz zmienić tag.

Jeżeli masz zapisaną relację pomiędzy klient - firma to powinieneś móc to łatwo pobrać poprzez:
  1. TableAPeer::doSelectJoinTableB();
mercii
Jestem zupelnie w tym zielony:
takie zapytanie daje aie cos:
  1. ...
  2. $c=new Criteria();
  3. $this->klient_list = KlientPeer::doSelectJoinFirma($c);

  1. Fatal error: Call to undefined method KlientPeer::doselectjoinfirma() in D:\xampp\htdocs\jobeet\apps\frontend\modules\klient\actions\actions.class.php on line 18
-=Peter=-
A w pliku schema.yml masz zdefiniowane relacje między tabelami?

PS. Pewnie literówka/niedopatrzenie, ale zobacz do klauzuli where zapytania z pierwszego postu winksmiley.jpg
mercii
  1. firma:
  2. _attributes: { phpName: Firma }
  3. id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
  4. nazwa: { type: VARCHAR, size: '255', required: false }
  5. nip: { type: VARCHAR, size: '10', required: true }
  6. regon: { type: INTEGER, size: '11', required: false }
  7. miasto: { type: VARCHAR, size: '255', required: false }
  8. ulica: { type: VARCHAR, size: '255', required: false }
  9. emial: { type: VARCHAR, size: '255', required: false }
  10. telefon: { type: VARCHAR, size: '45', required: false }
  11. klient:
  12. _attributes: { phpName: Klient }
  13. id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
  14. Firma_id: { type: INTEGER, size: '11', required: true }
  15. imie: { type: VARCHAR, size: '255', required: false }
  16. nazwisko: { type: VARCHAR, size: '255', required: false }
  17. miasto: { type: VARCHAR, size: '255', required: false }
  18. ulica: { type: VARCHAR, size: '255', required: false }
  19. email: { type: VARCHAR, size: '255', required: false }
  20. _indexes: { FI__07: [Firma_id] }

tak to wyglada od strony schema.
-=Peter=-
Tak jak podejżewałem, nie masz zdefiniowanych relacji. Pole "firma_id" powinno być kluczem obcym.

Odsyłam do dokumentacji: klik, dokładnie przeanalizuj przykładowy plik schema.

Po tym gdy dojdziesz do tego czego brakuje, przebuduj model. Wtedy ten wcześniejszy kod powinien działać.
mercii
No wlasnie zalozylem ze jak zakladalem klucze obce w DB Designer to ladnie mi to wszsytko przerobi sie na yml a tu niestety nie.
Jakie jest polecenie abym mogl przebudowac model bez kasowania danych z bazy danych?
propel-build-all - czyjak wybiore odpowiedz N na pytaniu to model sie przebuduje?
Czy moze uzywa ktos sfPropelCustomJoinHelper.class.php ?
Ja uzylem i dostalem taki blad.
  1. Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'KlientPeer::doSelectRS' was given in D:\xampp\htdocs\jobeet\apps\frontend\lib\helper\sfPropelCustomJoinHelper.class.p
    hp on line 111
  2.  
  3. Fatal error: Call to a member function next() on a non-object in D:\xampp\htdocs\jobeet\apps\frontend\lib\helper\sfPropelCustomJoinHelper.class.p
    hp on line 78

Czy moze byc wina zlego modelu?

...
Super wszystko działa. Pierwszym sposobem to rozwiazalem wg wskazowek Petera.
Ale w jaki sposob moge w indexSuccess pobrac dane?
echo $klient->getEmail()
ale jak pobrac
np. firma - > nazwa
Crozin
$klient->getFirma()->getNazwa()

btw: stosowanie polskiego nazewnictwa to niezbyt dobry pomysł.
Gribo
może zanim zaczniesz sam pisac przeanalizuj podręczniki do symfony. Jak byś to zrobił nie zadawał być tak banalnych pytań. Wystarczyło by pierwszych 2-3 lekcji biggrin.gif
mercii
Tutoriala czytam cały czas w mairę potrzeby ponieważ nie mam czasu na zrobienie przykładowej aplikacji tylko muszę testwoać już na mojej konkretnej.
Już poradziłem sobie z wiekszością problemów i uważam że symfony jest super.
Mam jedynie problemy z zapytaniami.
Muszę połączyć 3 tabele co realizuje poprzez:
  1. $c = new Criteria();
  2. WymianaCzesciPeer::doSelectJoinCzesci($c);
  3. WymianaCzesciPeer::doSelectJoinSamochod($c);
  4. WymianaCzesciPeer::doSelectJoinZlecenie($c);

mam dostęp do wszystkich danych które potrzebuje.
Jednak potrzebuje jeszcze ograniczyć ilość wyników poprzez podanie w tabelii wyników ograniczenia dla jednej z kolumn
  1. $request->getParameter('id_zlecenia')

Udaje mi się to mniej więcej poprzez
  1. $this->wymiana_list = WymianaCzesciPeer::retrieveByPk($request->getParameter('id_zlecenia'));

Ale zapytan tworzy sie 4-5 a ograniczenie wystepuje tylko w jednej.
Jak sobie z tym poradzic?questionmark.gif Bardzo dziekuje za pomoc.
Crozin
1) Pewnie już jest za późno ale osobiście sugerowałbym przerzucenie się na Doctrine winksmiley.jpg
2) Masz xxxPeer::doSelectJoinAll(Criteria c) - z tego powinieneś skorzystać
3) A jak w obiekcie Criteria ograniczyć wyniki do takich, gdzie wymianaCzęści.id = XYZ już pisać nie będę... masz to w dokumentacji jasno opisane
mercii
No i mam znowu problem.
Pobieram sobie dane, tworzą się zapytania sql i wszystko było by cacy gdyby nie fak ze muszę ograniczyc ilość wyświetlanych rekordów.
Opisze caly problem. Wiem ze moge to znaleść dokumentacji popróbować itd. Proszę mnie do miej nie odsyłac bo juz to robiłem.
  1. WymianaCzesciPeer::doSelectJoinAll($d);

daje mi takie zapytanie:
  1. SELECT wymiana_czesci.IDWYMIANA_CZESCI, wymiana_czesci.CZESCI_IDCZESCI, wymiana_czesci.SAMOCHOD_ID_VIN, wymiana_czesci.ZLECENIE_ID_ZLECENIA, wymiana_czesci.PRZEBIEG, wymiana_czesci.CENA, czesci.IDCZESCI, czesci.TYP_IDTYP, czesci.NAZAWA, czesci.NUMER, czesci.CENA, samochod.ID, samochod.PALIWO_ID, samochod.KLIENT_ID, samochod.MARKA, samochod.MODEL, samochod.POJEMNOSC, samochod.ID_TYP, samochod.ROK, samochod.VIN, zlecenie.ID_ZLECENIA, zlecenie.MECHANIK_IDMECHANIK, zlecenie.SAMOCHOD_ID_VIN, zlecenie.KLIENT_ID, zlecenie.DATAROZP, zlecenie.DATAZAK, zlecenie.CENA FROM `wymiana_czesci` LEFT JOIN czesci ON (wymiana_czesci.CZESCI_IDCZESCI=czesci.IDCZESCI) LEFT JOIN samochod ON (wymiana_czesci.SAMOCHOD_ID_VIN=samochod.ID) LEFT JOIN zlecenie ON (wymiana_czesci.ZLECENIE_ID_ZLECENIA=zlecenie.ID_ZLECENIA)

I nie wiem jak ograniczyc liczbe powtarzajacych sie rekordow:
Wiem ze nalezy to zrobic z uzyciem
  1. $d = new Criteria();
  2. $d->setDistinct(true);
  3. $d->addSelectColumn(WymianaCzesciPeer::ZLECENIE_ID_ZLECENIA);

Ale mi to nie działa. BAardzo proszę o pomoc.
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.