• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Slim, Twig, Illuminate database - jak wyświetlić wszystkie rekordy z bazy?

0 głosów
105 wizyt
pytanie zadane 10 marca 2018 w PHP, Symfony, Zend przez michh123 Bywalec (2,260 p.)

Witam serdecznie!

Pare dni temu zacząłęm się uczyć microframework'a Slim. Jest to moja pierwsza przygoda z frameworkami. Od razu zainstalowałem polecane przez użytkowników paczki Twig i Illuminate/Database. Bardzo, bardzo powoli zaczynam ogarniać o co w ogóle chodzi.
Próbuję więc napisać sam pierwszą prymitywną "aplikację", która ma tylko wyświetlić na ekran rekordy z bazy:

link do apki na GitHubie

Problem w tym, że w obecnym stanie żadne informacje się nie wyświetlają. Nie ma też żadnego błędu.
Najważniejsze są tu pliki: app/Controllers/HomeController.php oraz resources/views/home.twig, ponieważ wydaje mi się, że to w nich coś jest nie tak. w pliku HomeController.php jest metoda user(), a w niej zapytanie do bazy. W obecnym stanie to zapytanie nie działa... Działa tylko jeśli zmienię to zapytanie na 

return User::find(1);

No ale wtedy wyświetlany jest tylko jeden (w tym wypadku pierwszy) rekord.

Czy wiecie może, drodzy Forumowicze, jak naprawić ten kod, aby na ekranie wyświetlone zostały wszystkie rekordy z bazy?

Bardzo proszę o pomoc i z góry dziękuję za odpowiedzi.
Pozdrawiam!

1 odpowiedź

+2 głosów
odpowiedź 10 marca 2018 przez Arkadiusz Waluk Ekspert (245,210 p.)
wybrane 10 marca 2018 przez michh123
 
Najlepsza
Gdy masz ORMa to unikaj pisania ręcznie zapytań (chyba że to faktycznie konieczne), po coś go masz. Użyj na modelu metody get() czy all(), aby pobrać wszystkie rekordy. Następnie w templatce musisz zrobić pętlę, która wyświetli każdy rekord - w chwili obecnej masz jak widzę wyświetlenie tylko jednego, dlatego też działa, gdy zrobisz User::find(1) co odszukuje po id i zwraca jeden rekord.
komentarz 10 marca 2018 przez michh123 Bywalec (2,260 p.)

I nagle wszystko stało się jasne! :) Dziękuję bardzo za pomoc!

BTW: Od razu jak zadziałało spróbowałem starego sposobu z selectem. I nie działa. Działa tylko z get() lub all(), tak jak Pan pisał. Czy to właśnie dlatego nie powinno się pisać ręcznych zapytań podczas korzystania z ORM?

Jeszcze raz dziękuję za pomoc!
Pozdrawiam!

1
komentarz 10 marca 2018 przez Arkadiusz Waluk Ekspert (245,210 p.)

Nie, po prostu jeśli użyjesz ORMa to nie musisz bawić się z gołym SQLem. Kod staje się czytelniejszy bo są tylko wywoływane odpowiednie metody, nie będzie też problemów przy zmianie silnika bazy danych (np. z MySQL na PostgreSQL) bo ORM odwali całą robotę. Pisanie czystego zapytania zostawiłbym jako ostateczność - tzn. gdy jest ono na tyle skomplikowane, że ORM albo sobie z nim nie poradzi albo będzie ono mocno nieoptymalne.

Nie zmienia to jednak faktu, że czyste zapytania i tak powinny działać. Może chodzi o to, że nie wywołałeś na tym na koniec metody get(), jak w przykładzie.

komentarz 10 marca 2018 przez michh123 Bywalec (2,260 p.)

Ok, rozumiem :)

Faktycznie! dodając metodę get() wszystko nagle działa, ale musiałem zmienić zapytanie. W poprzednich wersjach ten kod wyglądał tak:

return User::select('select * from users');

Po pańskim poprzednim komentarzu zmieniłem na:

return User::select('select * from users')->get();

I wywaliło błąd. W końcu po spojrzeniu na dokumentację zmieniłem na:

return User::select('*')->get();

I wszystko działa. Jednakże zostanę przy metodzie all() tak jak Pan radził :)

Dziękuję i pozdrawiam!

1
komentarz 10 marca 2018 przez Arkadiusz Waluk Ekspert (245,210 p.)

A tak, z dokumentacji wynika, że oczekuje podania samych kolumn, * po prostu wyciągnie wszystkie, czyli w zasadzie zadziała tak samo jak all().

komentarz 10 marca 2018 przez michh123 Bywalec (2,260 p.)
A czy Pan korzysta na co dzień z Illuminate Database w pracy lub osobiście? Jeśli tak to jak ocenia Pan to API? Czy warto z niego korzystać i czy zabezpieczenia przed atakami na bazę są aktualizowane?
1
komentarz 10 marca 2018 przez Arkadiusz Waluk Ekspert (245,210 p.)
Korzystamy w pracy z Eloquenta, czyli to co własnie nazywasz "Illuminate datbase". Oceniam raczej kiepsko, nie przepadam za nim jak i Laravelem (który ma właśnie domyślnie Eloquenta jako ORM). Jak widać wiele metod można wywoływać statycznie, wprost na modelu. Model jednocześnie przyjmuje dane, daje dostęp do buildera zapytań i pozwala na wyciąganie danych, to wydaje się niezbyt uporządkowane. Szczególnie przy relacjach wychodzą później jakieś dziwne kwiatki, gdzie relacje zapisuje się z nawiasami a dołączony nimi model bez (albo odwrotnie, zawsze mi się to myli). Właściwości nie są nigdzie definiowane, tzn. model może mieć dane pole z bazy ale wcale nie musi. IDE będzie też miało problem z sugerowaniem metod czy właściwości modeli, trzeba ratować się phpDocumentorem albo jakimiś helperami.

Osobiście znacznie bardziej wolę Doctrine, z niego korzystam prywatnie gdzie tylko mogę. Tam ładnie oddzielone są repozytoria do zapytań od samej klasy encji, która to przechowuje dane. Pola zawsze są zdefiniowane, robi się do nich gettery i settery.

Czy warto korzystać ogólnie z ORMa to zależy. Przy małych projektach raczej jest to wzięcie "armaty na muchę", czyli dużej biblioteki do wykonania kilku prostych zapytań. Przy większych myślę że jak najbardziej, jest to spore ułatwienie. Obydwa wymienione są ciągle rozwijane, więc raczej powinny być na bieżąco. Z resztą bezpośrednich ataków na linii ORM-baza raczej nie ma, jest ogólnie sql injection co zabezpieczyć bardzo łatwo.
komentarz 10 marca 2018 przez michh123 Bywalec (2,260 p.)
Za Laravela nawet nie mam zamiaru się brać, od razu jak ogarnę w miarę Slima mam zamiar uczyć się Symfony :) A Doctrine już od dzisiaj!

Dziękuję bardzo za pomoc i odpowiedzi, i czekam na kolejną część pańskiego kursu :)
Pozdrawiam!
1
komentarz 10 marca 2018 przez Arkadiusz Waluk Ekspert (245,210 p.)
Ok, powodzenia :) Dzięki, kurs gdzieś tam niestety ciągle w przygotowaniu, ale w końcu będą dalsze lekcje ;)

Podobne pytania

0 głosów
1 odpowiedź 72 wizyt
0 głosów
0 odpowiedzi 53 wizyt
pytanie zadane 11 marca 2017 w PHP, Symfony, Zend przez niezalogowany
0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 27 czerwca 2018 w PHP, Symfony, Zend przez R[a]=d(ek); Mądrala (6,270 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

63,166 zapytań

109,401 odpowiedzi

228,554 komentarzy

42,674 pasjonatów

Przeglądających: 118
Pasjonatów: 12 Gości: 106

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...