2013-07-19 13 views
13

Forse a causa del mio background di Codeigniter, non mi trovo molto a godermi l'Eloquent ORM di Laravel 4. Dire che vorrei scrivere una query che ordini un elenco di post per id, discendente, come può Eloquent battere la chiarezza di DB::table('posts')->orderBy('id', 'desc')->get();?Quando utilizzare Eloquent (ORM) su Fluent (Query Builder)?

C'è una buona ragione per usare Eloquent over Fluent, è stato principalmente per la partecipazione ai tavoli?

risposta

29

Sono venuto da codeigniter anche e questa è la mia esperienza: Io uso Eloquent e Fluent di solito insieme. Eloquent è una cosa che ti permette di lavorare bene con le relazioni, le operazioni CRUD ecc. Quando hai bisogno di fare alcune operazioni SQL puoi facilmente aggiungere alcune funzioni fluenti

Nell'esempio che hai citato sopra vedo che hai la tabella dei post. Se si dispone di un modello di messaggio, allora la stessa cosa scritta utilizzando eloquente è:

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

Quindi, come ho capito se si estende eloquente di

Model_name::some_functions 

è lo stesso di

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

Il vero potere arriva quando è necessario creare o aggiornare un modello o, ad esempio, ottenere commenti post. Di quello che diventa facilmente:

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

Quindi la risposta è - è necessario utilizzare le funzioni fluente ottenere l'elenco ordinato. Puoi usarli entrambi con DB :: table ('posts') -> orderBy o Post :: orderBy

+0

thx, solo per confermare, per 'Messaggio :: trovare ($ id) -> commenti,' il metodo 'comments', ha a correre contro' tabella Post' o può essere un join tra la tabella 'Post' e' Comment'? – bitinn

+0

Non sono sicuro di aver capito. Hai una tabella di post e commenti, hai post_id nella tabella dei commenti e descrivi un metodo in post class (function comments() {return $ this-> hasMany ('comment');} Inoltre hai anche una classe di commenti. puoi usare Post :: find ($ id) -> commenti che si uniranno al tuo post con commenti (come selet * dai post unisci commenti su comments.post_id = posts.id) – Victor

+0

Come chiarimento Eloquent eredita da Fluent quindi sostanzialmente tutto ciò che avere in Fluent, può essere usato in Eloquent Se stai facendo 'Post :: find ($ id) -> comments', non stai facendo join per default ma prima 'SELECT * FROM posts WHERE id = $ id' e dopo 'SELECT * FROM comments WHERE post_id = $ id' ma solo quando invochi/chiedi' -> commenti'. Se vuoi caricare tutte le relazioni contemporaneamente, controlla [Eloquent's Eager Caricamento in corso] (http://laravel.com/docs/eloquent#eager-loading). – trm42

3

Utilizzando i modelli ed Eloquent, puoi anche scrivere funzioni personalizzate nella classe del modello per eseguire operazioni comuni come, ad esempio, emettendo un paio di campi concatenati.

per esempio:

<?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

Possiamo fare ancora di più con le funzioni getXAttribute(). Ad es: getFullNameAttribute() allora possiamo semplicemente fare $ user-> fullName. – euantorano

+0

@euantorano Anzi, buon punto! –

Problemi correlati