Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [Kohana]problem z zapytaniem
grzes999
post
Post #1





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Mam mały problem z zapytaniem. Załóżmy że mam dwie tabele, w jednej mam: id,obiekt a w drugiej inne_id i id_obiektu. Czyli tabele są połączone poprzez id obiektu. I teraz jeden obiekt może być kilka razy w drugiej.I teraz jak piszę:
  1. DB::select()->from('ogloszenie_wyp')->join('ogloszenie')->on('id_ogl', '=', 'id_ogloszenia')->execute();

to pobiera mi się tylko jedna wartość z drugiej tabeli a potrzebuję wszystkie. Proszę o pomoc.

Ten post edytował grzes999 27.03.2012, 23:46:15
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A składnię join() i from() w Kohanie tyś widział?
Wersja 2.x http://docs.kohanaphp.com/libraries/database/builder#join
Wersja 3.x http://kohanaframework.org/3.0/guide/datab...y/builder#joins
Teraz popatrz, porównaj ze swoim. Ja już nawet literówek nie wypominam bo dwie widzę od razu...


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
grzes999
post
Post #3





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Widziałem i ten przykład pisałem na szybko i pominąłem i ja nie mam problemu z tym że mi zapytanie nie dzial tylko z tym że pobiera tylko jeden rekord z drugiej tabeli.
Go to the top of the page
+Quote Post
r4xz
post
Post #4





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


1. popraw temat
2. wklej w takim razie twoje zapytanie to może poznamy przyczynę takiego, a nie innego zachowania


--------------------
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Grześ... W takim razie z czym masz problem? Z ubraniem zapytania w query buildera Kohany (przy okazji która wersja?) czy z samym skleceniem zapytania? Jeśli to pierwsze to jeszcze od biedy temat tu może zostać, ale jeśli to drugie to trochę niezbyt prawidłowy dział wybrałeś wink.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
grzes999
post
Post #6





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Wersja Kohany 3.2 i zapytanie działa tylko z tej drugiej tabelipobiera mi tylko jeden rekord a nie wszystkie jakie są do danego id.

Moje zapytanie

  1. DB::select()->from('ogloszenie_wyp')->join('ogloszenie')->on('id_ogl', '=', 'id_ogloszenia')->execute();


Ewewntualnie może jakoś to rozbić na dwa zapytania tylko jak je póżniej połączyćquestionmark.gif
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Takie coś powinno wygenerować zapytanie:
SELECT tu_kolumny FROM ogloszenie_wyp JOIN ogloszenie ON ig_ogl = id_ogloszenia
Pytanie się rodzi czy o takie Ci chodzi? Czy wrzucone prosto do bazy daje Ci rzeczywiście to co chcesz? Bo może to nie jest problem z Kohaną, ale nieprawidłowo utworzonym zapytaniem? Zrób debug zapytania jakie generuje query builder (jest przechowywane w obiekcie) i porównaj z tym, jakie chcesz uzyskać. Możesz się zdziwić czasem wink.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
skowron-line
post
Post #8





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


@grzes999 najpierw napisz sobie zapytanie z palca, takie które zwraca żądany wynik w PMA, a później do QB wpisuj.
  1. echo DB::select()->from('ogloszenie_wyp')->join('ogloszenie')->on('id_ogl', '=', 'id_ogloszenia');

i wklej do PMA


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
thek
post
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Nie echo smile.gif Query builder zwraca obiekt, więc nic to nie da. Poza tym kohana ma wbudowaną funkcję wyświetlającą, odpowiednik var_dump -> Kohana::debug($zmienne) http://kohanaframework.org/3.0/guide/kohana/debugging


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
skowron-line
post
Post #10





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(thek @ 28.03.2012, 07:30:02 ) *
Nie echo smile.gif Query builder zwraca obiekt, więc nic to nie da.

Zadziała też, wiem bo sam tak robię
z manuala
  1. echo Debug::vars((string) $query);
  2. // Should display:
  3. // SELECT `username`, `password` FROM `users` WHERE `username` = 'john'


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
grzes999
post
Post #11





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


No i sprawdziłem i zapytanie jest takie jak chce i jeżeli wpisuje je ręcznie do bazy to otrzymuję to co chce. Może źle to wypisuje.

  1. foreach($oferty as $oferta) :
  2. echo $oferta['gdzie']; echo $oferta['od']; echo $oferta['do'];
  3. echo $oferta['opis'];
  4. echo $oferta['cena'];
  5. switch ($oferta['has_wyposazenie'])
  6. {
  7. case('1'):
  8. echo "lazienka";
  9. break;
  10. case('2'):
  11. echo "telewizor";
  12. break;
  13. case('3'):
  14. echo "radio";
  15. break;
  16. case('4'):
  17. echo "ognisko";
  18. break;
  19. case('5'):
  20. echo "gril";
  21. break;
  22. default:
  23. echo "Brak dodatowych opcji";
  24. break;
  25. }
  26.  
  27. endforeach;


Ten post edytował grzes999 28.03.2012, 10:02:30
Go to the top of the page
+Quote Post
skowron-line
post
Post #12





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


A przypadkiem break w switch Ci nie kończy pętli foreach odrazu questionmark.gif

@down
odpowiedz w formie pytania

Ten post edytował skowron-line 28.03.2012, 11:43:20


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
phpion
post
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@up:
No co Ty smile.gif
Go to the top of the page
+Quote Post
grzes999
post
Post #14





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Cytat(skowron-line @ 28.03.2012, 12:17:39 ) *
A przypadkiem break w switch Ci nie kończy pętli foreach odrazu questionmark.gif

@down
odpowiedz w formie pytania


W takim razie w jaki sposób wykonać tylko te akcje, kótre chcę a nie wszystkie??
I jeszcze jedno pytanie bo teraz wyświetla mi kilka razy to samo.
To znaczy jeżeli do jednego obiektu jest kilka rekordów w drugiej tabeli to wyświetla tle razy ile jest rekordów w tej drugiej tabeli.
Można to jakoś ograniczyć. Wiem, że to jest bardziej pytanie z SQL ale nie będę już zakładał drugiego tematu.
Go to the top of the page
+Quote Post
skowron-line
post
Post #15





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Napisz co chcesz wyciągnąć z bazy, będzie prościej.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
grzes999
post
Post #16





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


W bazie mam w jednej tabeli mam hotele a w drugiej tabeli wyposażenie dodatkowe takie ognisko,gril,wifi,parking,itd i chcę wyciągnąć wszystkie informacje o pokoju. Z podstawowymi nie ma problemu tylko z tymi dodatkowymi się troszkę meczę.

hotel

id | gdzie | opis

wyposazenie

id_wyposazenia | co

has_wyposazenie

id_has | id_pokoju | id_wyposazenia

Mniej więcej tak wygląda moja baza i niestety musi tak zostać bo jest częścią większej całości i nie opłaca się już przerabiać.
Go to the top of the page
+Quote Post
thek
post
Post #17





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To w takim razie pchaj to jako tablicę, czyli where('pole', 'IN', TABLICA_Z_ID_WYPOSAŻENIA) smile.gif
U Ciebie nie jest bowiem JOINowanie problemem, ale kryterium wyszukiwawcze wink.gif
Twoje zapytanie więc to...
1. Jeśli jest podane w kryteriach wyposażenie dorób join na tabelę z wyposażeniem
2. Jeśli już zjoinowałes, dorzuć kryterium wyszukiwawcze, gdzie id_wyposażenia wybranego pchniesz jako tablicę do where('id_wyposazenia', 'in', $tablica_wybranych_id)
3. Dodatkowo pogrupuj to po id_pokoju lub id obiektu, zależnie co chcesz pokazać.
Tu następuje rozwidlenie bo mozna do sprawy podejść na 2 sposoby:
4.1. Nie muszą wystapić wszystkie kryteria wyszukiwawcze, ale musi być trafione choć jedno.
a. tylko order malejacy po zliczonej ilości różnych kryteriów (kilka pokoi w jednym obiekcie to kilka trafionych a ma być w takim wypadku zliczone jako 1 a nie kilka)
4.2. Muszą wystąpić wszystkie kryteria:
a. tu jest zabawa smile.gif Musisz policzyć ile masz kryteriów wyszukiwawczych dla każdego obiektu (znów uwaga jak w alternatywnym podejściu. Kilka trafień w to samo kryterium = 1, anie przypuśćmy 5) i wybrać te, gdzie liczba ta jest równa ilości kryteriów w zapytaniu. Having się kłania wink.gif

Jak rozwiązać kwestię wyposażenia? Prosto... Albo z cache, albo na początku skryptu pobierz/utwórz tablicę gdzie masz inna tablicę typu klucz_id => wyposażenie. Teraz z formularza pobierasz id wybranych elementów wyposażenia. Dla pewności sprawdź, czy Ci ktoś nie spreparował formularza i zrób częśc wspólną tego co przyszło z formularza oraz wzorcowych. array_intersect przy czym dla wygody można wszystkie klucze wzorcowe machnąć jako array_keys.

Jak sam widzisz, nie Kohana Ci sprawia problem, ale logika skryptu.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
grzes999
post
Post #18





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


thek dzięki za wyjaśnienie ale samo się trochę teraz zamotałem w tym co napisałeś ale na spokojnie powinienem to ogarnąć.

I może lepiej jest zrobić dwa zapytania?? To znaczy w modelu zrobił bym dwie funkcje. Jedna pobierała by wszystko i zwracała id_obiektu a druga by pobierała wszystkie atrybuty. Tylko nie wiem czy tak można :/

I tam jest małe niedopatrzenie w schemacie mojej bazy.

pokoju

id_pokoju | gdzie | opis

wyposazenie

id_wyposazenia | co

has_wyposazenie

id_has | id_pokoju | id_wyposazenia

Bo chyba rozważałeś, że id w tej pierwszej tabeli to co innego niż w tej ostatniej a to jest to samo.

Ten post edytował grzes999 28.03.2012, 15:27:15
Go to the top of the page
+Quote Post
thek
post
Post #19





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Metody modelu pisze się tak, by był przydatne wink.gif Co do tabeli to w ostatniej id_has nawet nie jest potrzebne. Wystarczy nadać klucz unique na połączone id_pokoju i id_wyposażenia. Co do reszty to join rób tylko gdy w searchu masz wybrane wyposażenie. Inaczej join jest zbędny.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
grzes999
post
Post #20





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Próbuję pisać zapytanie tak jak mi poradziłeś thek ale mam problem z tablicą bo gdy ją deklaruję jako pustą to mi wywala błąd a gdy nie deklaruję to wiadomo błąd że nie jest zadeklarowana

Kod
Database_Exception [ 1064 ]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') GROUP BY `id_pokoju'`' at line 1 [ SELECT * FROM `pokoje` JOIN `has_wyposazenie` ON (`id_pokoju` = `id_pokl`) WHERE `id_wyposazenia` IN () GROUP BY `id_pokoju` ]


Moje zapytanie

  1. $result = DB::select()->from('pokoje)->join('has_wyposazenie')->on('id_pokoju', '=', 'id_pokl')
  2. ->where('id_wyposazenia', 'IN', $tablica)->group_by('id_pokoju')->execute();


Ten post edytował grzes999 29.03.2012, 13:23:30
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 21.08.2025 - 14:22