![]() |
![]() |
![]()
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ę:
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 |
|
|
![]() |
![]()
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... |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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ś (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
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
Ewewntualnie może jakoś to rozbić na dwa zapytania tylko jak je póżniej połączyć(IMG:style_emoticons/default/questionmark.gif) |
|
|
![]()
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 (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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 (IMG:style_emoticons/default/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
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie echo (IMG:style_emoticons/default/smile.gif) Query builder zwraca obiekt, więc nic to nie da. Zadziała też, wiem bo sam tak robię z manuala
|
|
|
![]()
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.
Ten post edytował grzes999 28.03.2012, 10:02:30 |
|
|
![]()
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 (IMG:style_emoticons/default/questionmark.gif)
@down odpowiedz w formie pytania Ten post edytował skowron-line 28.03.2012, 11:43:20 |
|
|
![]()
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 (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
A przypadkiem break w switch Ci nie kończy pętli foreach odrazu (IMG:style_emoticons/default/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. |
|
|
![]()
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.
|
|
|
![]()
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ć. |
|
|
![]()
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) (IMG:style_emoticons/default/smile.gif)
U Ciebie nie jest bowiem JOINowanie problemem, ale kryterium wyszukiwawcze (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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. |
|
|
![]()
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 |
|
|
![]()
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 (IMG:style_emoticons/default/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.
|
|
|
![]()
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
Ten post edytował grzes999 29.03.2012, 13:23:30 |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Zobacz jakie zapytanie Ci wypluwa na ekran
nie ma czegoś takiego jak IN (), między nawiasami coś musi się znajdować. Twoja zmienna jest pusta. |
|
|
![]()
Post
#22
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Bo $tablica powinna zawierać pobrane z formularza id_wyposażenia. Nie może być pusta. Właśnie dlatego napisałem, że JOINujesz i dajesz to WHERE tylko gdy jakiekolwiek wyposażenie zostało wybrane. Query Builder istnieje, by sobie palnąć IF i wykryć czy mamy to zrobić "po drodze". Ja na Twoim miejscu przekazywałbym dane $_POST jako tablicę do metody szukającej. Metoda by ją sobie przefiltrowała i na podstawie danych uzupełniała odpowiednie warunki czy Joinowała odpowiednie tabele. Przykładowo bym w formularzu umieścił checkboxy jako tablicę (name="wyposazenie[]"), gdzie jako ich value podrzucałbym id_wyposażenia. Odczyt takiej tablicy, walnięcie części wspólnej z prawidłową tablicą id_wyposażenia (w ramach walidacji) i posłanie do warunku where() to wszystko co wystarczy zrobić.
|
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Tylko problem jest taki że ja nie mam formularza i nie wiem skąd ten pomysł ;p
Ja to pobieram z bazy i wyświetlam na stronie. Ogólnie większość treści jest pobierana z bazy (IMG:style_emoticons/default/wink.gif) Tylko z tym problemem nie mogę sobie poradzić. |
|
|
![]()
Post
#24
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli to tylko pobór z bazy, to where niepotrzebne. Robisz group by i w select dajesz GROUP_CONCAT(wyposazenie_id), co Ci wszystkie id_wyposażenie dla pokoju walnie po przecinku.
|
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie wszystko działa (IMG:style_emoticons/default/Lkingsmiley.png)
I jeszcze mam małe pytanie jeżeli chciał bym zrobić sobie funkcję, która będzie w switchu w zależności od id wstawiała obrazek. To piszę sobie nową metodę w modelu coś takiego
W kontrolerze piszę takie coś
I w kontrolerze przy jej wywołaniu muszę wstawić parametr i teraz moje pytanie. Co wstawić(IMG:style_emoticons/default/questionmark.gif) W widoku to wiadomo wstawiam id_wyposazenia i w pętli wyświetlam a co z kotrolerem?? W powyższym przypadku wyświetli wiadomy błąd.
|
|
|
![]()
Post
#26
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jak dla mnie to źle podszedłeś do tego... Skoro funkcja wstawia obrazki, to ja to widze tak:
1. W kontrolerze do widoku wrzucasz jedynie tablicę z id_wyposażenia, albo string zawierający wszystkie id_wyposażenia oddzielone przecinkami lub innym delimiterem (czyli tak, jak dostajesz to z bazy) 2. Funkcja obrazki to Helper widoku, która odbiera ową tablicę lub string i w zależności od tego co to jest - reaguje. a. jeśli to tablica to sprawdź ilość elementów i zwaliduj je pod kątem zgodności z bankiem id_wyposażenia. Jeśli po walidacji jest przynajmniej jeden element, puść na switch w pętli po elementach zwalidowanych, przy czym default ma być pusty. b. jeśli to string to explode do tablicy i dalej już jak w punkcie a. |
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Ok tylko że w zapytaniu oprócz id_wyposazenia pobieram też inne dane dotyczące pokoju.
I trochę głupie pytanie mógł byś podesłać jakiegoś linka jak zrobić takiego helpera. Gdyż w Kohanie nie jestem tak bardzo obeznany. Znalazłem takie coś tylko nie jestem pewien czy o to ci chodzi. Kohana->helper |
|
|
![]()
Post
#28
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli używasz Kohany z gałęzi 2.x to owszem, możesz tak zrobić. W Kohanie 3.x nieco inaczej, gdyż tam jest inna hierarchia w związku z HMVC, ale i tam można zrobić prosty myk, by działało jak helpery w Kohanie 2.x. Kwestia dodania jednego dodatkowego pliku extendującego "po drodze", jeśli ktoś się przyzwyczaił do używania helperów jak w 2.x
|
|
|
![]()
Post
#29
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Ja osobiście używam 3.2 tak że będę musiał coś w manualu poszukać.
Ale tak ogólnie to jak trzeba zapisać tą moją poprzednią funckję bez użycia helpera bo będę potrzebował wyświetlić do danego pokoju komentarze. I wtedy tak by chyba było najprościej. I jest jesze jeden problem tym razem chyba bardziej z Kohana. Otóż w jednym zapytaniu pobieram wszystkie informacje o pokoju i do kazdego pokoju mogą być komentarze. Więc w drugim zapytaniu pobieram komentarze do tego pokoju. Wiem że mogę pobrać to w jednym zapytaniu ale te zapytania i tak są dość skomplikowane dlatego nie chce ich jeszcze bardziej komplikować. I teraz moje pytanie jak przekazać do drugiego zapytania id_obiektu pobrane z pierwszego. Moje dwa modele. Do pobierania informacji o pokoju.
I drugi do pobierania komentarzy do pokoju i nie tylko
Jak widać na razie wstawiłem na stałe id_ogloszenia=2 Wiem że trzeba przekazać parametr w funkcji i wpisać go w zapytanie ale jak to później napisać w kontrolerze?? Ten post edytował grzes999 30.03.2012, 21:06:46 |
|
|
![]()
Post
#30
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A o parametrach funkcji słyszałeś? (IMG:style_emoticons/default/wink.gif)
$model->ogłoszenie($zmienna); Nie mów, że wszystkie funkcje do tej pory pisałeś i wywoływałeś bezparametrowo... |
|
|
![]()
Post
#31
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
No oczywiście że nie (IMG:style_emoticons/default/wink.gif) tylko co ma być w kontrolerze w tej zmiennej??
Bo jak wrzucę nie zdefiniowaną to wiadomo błąd a jak wstawiłem pustą zmienną i w widoku tak wywyływałem $wywolanie($ogloszenie['cos']) To wywala mi błąd że call function must by string albo jakoś tak i głównie z tym mam problem. Ten post edytował grzes999 30.03.2012, 21:49:11 |
|
|
![]()
Post
#32
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Napiszę tak... Przeczytaj jakiś poradnik o tym jak się tworzy i wywołuje klasy w Kohanie. Bez tego możemy Ci pomagać, pisać kod, a i tak nic nie zrozumiesz. Wpierw zapoznaj się z podstawami frameworka na jakichś tutorialach i wróć gdy już coś opanujesz. Skoro już się łapiesz za FW to wpierw go choć trochę poznaj byś wiedział co z czym ugryźć, a nie, że liznąłeś php i od razu się rzucasz na coś, czego idei nie rozumiesz. Czy jeśli nauczyłeś się jeździć na rowerze, to siadasz na motocykl bo "oba mają dwa koła, kierownicę i siedzenie oraz ramę"? Przeskoczyć z czystego php można od razu na framework, ale to wymaga zdolności już jakichś z innych języków i rozmienia zasad działania.
|
|
|
![]()
Post
#33
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem mniej więcej zasadę działanie MVC. Mogę poczytać tutorial tylko cięzko znaleźć coś dobrego w sieci.
Niby czytałem manuala ale nie wile mi pomogło to przy moim problemie i dlatego proszę o przykład jak takie coś się piszę i wtedy łatwiej będzie mi wyciągnąć wnioski i zrozumieć. Niby zrobiłem tylko nie wiem czy to jest poprawne w widoku wpisuje coś takiego i działa
Ten post edytował grzes999 31.03.2012, 02:32:02 |
|
|
![]()
Post
#34
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Bo tak właśnie wygląda jedno z możliwych poprawnych wywołań. Są krótsze także. Jeśli używałeś w modelu wywołania połączenia z bazą danych (DB) to chyba wiesz już jak wygląda krótsze (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#35
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wszystkim za bardzo dobrą i szybką pomoc.
Temat uważam za zamknięty (IMG:style_emoticons/default/wink.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.09.2025 - 21:33 |