2013-07-19 8 views
13

Być może ze względu na moje pochodzenie Codeigniter, po prostu nie cieszę się z Eloquent ORM Laravel 4. Załóżmy, że chciałbym napisać zapytanie, które zamawia listę postów według id, malejąco, jak Eloquent może pokonać jasność DB::table('posts')->orderBy('id', 'desc')->get();?Kiedy używać narzędzia Eloquent (ORM) over Fluent (Query Builder)?

Czy istnieje dobry powód, aby używać Eloquent over Fluent, głównie do łączenia tabel?

Odpowiedz

29

Pochodziłam z codeigniter również i to jest moje doświadczenie: Używam Eloquent i Fluent zwykle razem. Eloquent to rzecz, która pozwala ci ładnie pracować z relacjami, operacjami CRUD itp. Kiedy potrzebujesz wykonać pewne operacje SQL, możesz łatwo dodać płynne funkcje. W przykładzie, o którym wspomniałeś powyżej, widzę, że masz tabelę postów. Jeśli masz model poczta to samo napisane przy użyciu Eloquent jest:

Post::orderBy('id', 'desc')->get(); 

Więc jak rozumiem, jeśli rozciąga Eloquent niż

Model_name::some_functions 

jest taka sama jak

DB::table('table_name')->some_functions 

Prawdziwa moc pojawia się, gdy trzeba utworzyć lub zaktualizować model lub na przykład uzyskać komentarze do postu. Następnie staje się to łatwe:

$comments = Post::find($id)->comments; 

Odpowiedź brzmi - musisz użyć płynnych funkcji, aby uzyskać uporządkowaną listę. Możesz ich używać zarówno z DB :: table ("posty") -> orderBy lub Post :: orderBy

+0

thx, tylko potwierdzenia dla 'Post :: find ($ id) -> Komentarze,' Katalog 'metoda comments', to trzeba uruchomić przed' tabeli Post' , czy może być łączeniem między tabelami "Post" i "Comment"? – bitinn

+0

Nie jestem pewien, czy rozumiem. Masz tabelę postów i komentarzy, masz post_id w tabeli komentarzy i opisujesz metodę w post class (function comments() {return $ this-> hasMany ('comment');} .Ile też masz klasę komentarzy. możesz użyć Post :: find ($ id) -> komentarzy, które dołączą do twojego posta z komentarzami (np. selet * z postów dołącz komentarze na komentarze.post_id = posts.id) – Victor

+0

Jako wyjaśnienie, Eonquent dziedziczy po Fluent, więc w zasadzie wszystko co ty mieć w wersji Fluent, może być użyty w elokwentnie Jeśli robisz "Post :: find ($ id) -> comments", nie robisz łączenia domyślnie, ale najpierw 'SELECT * FROM wpisów WHERE id = $ id' i później 'SELECT * FROM comments WHERE post_id = $ id' ale tylko wtedy, gdy wywołasz/pytasz o' -> komentarze'. Jeśli chcesz załadować wszystkie relacje w tym samym czasie, sprawdź [Eloquent's Eager Ładowanie] (http://laravel.com/docs/eloquent#eager-loading). – trm42

3

Korzystając z modeli i Eloquent, możesz również pisać niestandardowe funkcje w klasie swojego modelu do wykonywania typowych operacji, takich jak, powiedzmy, wyprowadzanie kilku połączonych pól.

na przykład:

<?php 
class User extends Eloquent { 
    //Standard Relation Function 
    public function posts() { 
     return $this->hasMany('Post'); 
    } 
    //Custom function 
    public function fullname() { 
     return $this->firstName.' '.$this->lastName; 
    } 
} 

//Somewhere else in your code, if you need a users full name... 
$user = User::find(3); 
$name = $user->fullname(); 
+7

Możemy to zrobić jeszcze dalej dzięki funkcjom getXAttribute(). Np .: getFullNameAttribute(), możemy po prostu wykonać $ user-> fullName. – euantorano

+0

@euantorano Rzeczywiście, dobry punkt! –

Powiązane problemy