Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [laravel]model
Forum PHP.pl > Forum > PHP > Frameworki
marcus753
wybaczcie, mam już wyrzuty sumienia - 3 post z kolei mojego autorstwa ale chyba tylko tutaj można spotkać ludzi którzy wiedzą o czym piszą Lkingsmiley.png

Tym razem chodzi o model, kurcze jaką on pełni rolę ?

W katalogu models tworze sobie klase które jest rozszerzeniem klasy Eloquent która to zawiera pewne podstawowe metody/zapytania. Tylko że w większości przykładów ludzie w tej klasie definiują jedynię nazwę tabeli a zapytanie piszą w kontrolerze na zasadzie
  1. MojaKlasa::find(1)
zamiast
  1. DB::select(select * from `moja tabela` where id='1');


Załóżmy że mam 2 formularze, jeden służy do CRUD użytkowników a drugi CRUD userów do tej pory w CI robiłem sobie jeden model np. base_model gdzie miałem 4 funkcje każda z nich przyjmowała 2 parametry nazwę tabeli na której ma działać i opcjonalny parametr z danymi, dzięki temu w kontrolerze mogłem sobie wywołać po prostu metodę
  1. dodaj($nazwa_tabeli,$tablica_z_danymi_do_dodania)


Jak coś takiego powinno się robić w laravelu ? przeglądam już chyba 3 przykład gdzie autor po prostu zapytania SQL pisze w kontrolerze a sam plik w katalogu models tworzy jedynie po to by podać nazwę tabeli...
Pyton_000
Model jest po to aby móc dla konkretnej tabeli zdefiniować jakies określone metody np. findAllUniqueUsersBySurname....
Dzięki temu wiesz że dana metoda operuje na danej tabeli.

a przykład z find(1) to jest standardowa metoda która wyszuka rekord o ID = 1 z danego modelu (tudzież z konkretnej tabeli opisanej przez Model)
marcus753
^^ czyli rozumiem że w modelu nie używamy kodu sql a jedynie definiujemy zmienne które potem wykorzystujemy korzystając z wbudowanych zapytań klasy Eloquent w kontrolerze ?

Tylko że wtedy jeśli nie chcemy korzystać z wbudowanych zapytań a sami pisać swój kod SQL definiowanie modelu jest zupełnie niepotrzebne dobrze rozumiem ?

Ewentualnie istnieje możliwość pisania swoich własnych zapytań w modelu ? tylko że tedy odnosimy się do klasy DB czy do rodzica ?
memory
Jeżeli dziedziczysz Eloquent to używasz ORM http://laravel.com/docs/eloquent.




marcus753
^^ o widzisz trochę mi rozjaśniłeś sytuację czyli:

wykorzystując klase DB::metoda_statyczna zapytania piszemy w kontrolerze i w ogóle nie korzystamy z modelu
wykorzystując dziedziczenie z Eloquent zapytania piszemy w kontrolerze natomiast pola,zmienne oraz metody które je definiują przechowujemy w plikach w modelu

czy w klasie DB:: mogę zdefiniować swoje własne zapytanie sql ? nie korzystając z metod insert select update itp. coś w rodzaju DB::SQL('moje zapytanie') <- w dokumentacji czegoś takiego nie widziałem ;(

Rozumiem że w laravelu nie ma podobnego mechanizmu co w Codeigniterze ? tzn. jeden standardowy model (który sam sobie definiuje) i który może mi obsłużyć kilka tabel?

Swoją drogą, tak się zastanawiam widząc taki kod:

  1. DB::table('users')
  2. ->where('name', '=', 'John')
  3. ->orWhere(function($query)
  4. {
  5. $query->where('votes', '>', 100)
  6. ->where('title', '<>', 'Admin');
  7. })
  8. ->get();


który daje nam takie zapytanie sql:

  1. select * from users where name = 'John' or (votes > 100 and title <> 'Admin')


czy to czasami nie jest sztuka dla sztuki ? przecież szybciej i dla mnie czytelniej jest napisać czysty kod SQL (który przecież trudny nie jest i stosunkowo przejrzysty) niż definiować wbudowane metody z parametrami...
memory
Tak, jest prościej ale załóżmy, że musisz wypisać 10 użytkowników

  1. DB::query(select * from users limit 10);


Klient prosi o zmianę bazy danych z mysql do microsoft sql server. Zamieniasz w configu na mssql i nagle dupa. W mssql nie ma czegoś takiego jak LIMIT jest TOP. Aplikacja do poprawki.
Gdy używasz wrapper'a czy ORM problemu zazwyczaj nie ma.

Laravel daje ci wolną ręke.

  1. Given this tables:
  2.  
  3. Users
  4. id
  5. name
  6.  
  7. Posts
  8. id
  9. content
  10. user_id
  11.  
  12. Select all post from specific user:
  13.  
  14.  
  15. /* First Way */
  16. $user=User::find(1); // Just Eloquent
  17. $posts=$user->posts; // Just Eloquent
  18.  
  19. /* Second Way */
  20. $posts=User::with('posts')->find(1); // Eloquent with Eager loading
  21.  
  22.  
  23. /* Third Way */
  24. $posts=User::find(1)->load('posts'); // Eloquent with Lazy Eager Loading
  25.  
  26.  
  27. /* Fourth Way */
  28. $posts=User::join('posts','users.id','=','posts.user_id')->where('users.id',1)->get(); // Eloquent with Query Builder methods
  29.  
  30.  
  31. /* Fifth Way */
  32. $posts=DB::table('users')->join('posts','users.id','=','posts.user_id')->where('users.id',1)->get(); // Just Query Builder
  33.  
  34. /* Sixth Way */
  35. $posts=DB::select('select * from users join posts on users.id = posts.user_id where users.id = 1'); // Just SQL


Wszystko zależy od ciebie. Jeżeli nie chcesz ORM usuwasz extends i tak jak w Ci dodajesz metody dodaj,usun itd


marcus753
tylko że jak rozumiem takie zapytanie wykonuje nie w modelu a kontrolerze:

  1. DB::query(select * from users limit 10);


a gdybym chciał je wykonać w modelu? jest jakaś domyślna konstrukcja która mi to umożliwia ? Czy jak przypuszczam z plików modelu korzystamy tylko wtedy gdy używamy ORM ?
memory
W modelu do tego służy. Musisz nauczyć się obsługi ORM


  1. class Users extends Eloqent {
  2.  
  3. function getAll($limit = 0){
  4. return $this->take($limit)->get();
  5. }
  6.  
  7. function findyById($id){
  8. return $this->find($id);
  9. }
  10.  
  11. // itd
  12. }
marcus753
auć no to to jest wada i to dosyć duża, czyli jak rozumiem jeśli nie chcemy korzystać z orm-a to nie możemy definiować zapytań w modelu a pozostaje nam jedynie kontroler, z kolei decydując się na ORMa decydujemy się również na konstrukcję (jeden model odpowiada jednej tabeli w bazie) dodatkowo pewnie są zapytania których w ormie zrobić się nie da i wtedy musimy robić je standardowo w kontrolerze niszcząc tym samym podział MVC ehh
pitu
Jeżeli nie chcesz używać ORM to twój model nie dziedziczy po Eloqent. Normalnie w nim tworzysz metody i korzystasz w nich z query buildera.

  1. class ExampleModel{
  2. public static function getData(){
  3. DB::table('users')->select('kolumna')->get();
  4. }
  5. }


Cytat
dodatkowo pewnie są zapytania których w ormie zrobić się nie da i wtedy musimy robić je standardowo w kontrolerze niszcząc tym samym podział MVC


Nic nie musisz robić w kontrolerze, a nawet nie powinieneś.
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.