2013-07-19 4 views
13

Vielleicht finde ich aufgrund meines Codeigniter-Hintergrunds einfach nicht viel Spaß mit Laravel 4's Eloquent ORM. Angenommen, ich möchte eine Abfrage schreiben, die eine Liste von Posts nach ID sortiert, absteigend, wie kann Eloquent die Klarheit von DB::table('posts')->orderBy('id', 'desc')->get(); schlagen?Wann Eloquent (ORM) über fließend (Query Builder) zu verwenden?

Gibt es einen guten Grund, Eloquent über Fluent zu verwenden, war es hauptsächlich für das Verbinden von Tabellen?

Antwort

29

Ich kam auch aus codeigniter und das ist meine Erfahrung: Ich benutze eloquent und fließend meist zusammen. Eloquent ist eine Sache, die Ihnen erlaubt, gut mit Beziehungen, CRUD-Operationen usw. zu arbeiten. Wenn Sie einige SQL-Operationen ausführen müssen, können Sie leicht einige fließende Funktionen hinzufügen

In dem oben erwähnten Beispiel sehe ich, dass Sie posts table haben. Wenn Sie ein Post-Modell haben dann die gleiche Sache geschrieben Eloquent verwendet, ist:

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

So wie ich es, wenn man Eloquent erstreckt als

Model_name::some_functions 

die gleiche wie

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

Die wahre Stärke kommt, wenn Sie ein Modell erstellen oder aktualisieren müssen oder beispielsweise Post-Kommentare erhalten. Dann wird es leicht:

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

Also die Antwort ist - Sie müssen fließende Funktionen verwenden, um geordnete Liste zu bekommen. Sie können beide mit DB :: table ('posts') -> orderBy oder Post :: orderBy verwenden

+0

thx, bestätigen nur, für 'Beitrag :: find ($ id) -> Kommentare;' 'die comments' Methode, hat es gegen' Post' Tisch laufen oder kann es eine Verbindung zwischen 'Post' und' Comment' Tabelle sein? – bitinn

+0

Nicht sicher, ich verstehe. Sie haben eine Post- und Kommentartabelle, Sie haben Post-ID in der Kommentartabelle und Sie beschreiben eine Methode in der Post-Klasse (Funktion comments() {return $ this-> hasMany ('comment');}. Und Sie haben auch die Comment-Klasse Sie können Post :: find ($ id) -> Kommentare verwenden, die Ihrem Beitrag mit Kommentaren beitreten (wie selet * aus Beiträgen kommen Kommentare auf comments.post_id = posts.id) – Victor

+0

Zur Klärung erbt Eloquent von Fluent also grundsätzlich alles was Sie tun in Fluent, kann in Eloquent verwendet werden Wenn Sie 'Post :: find ($ id) -> comments' tun, tun Sie nicht beitreten standardmäßig aber zuerst 'SELECT * FROM posts WHERE id = $ id 'und danach 'SELECT * FROM Kommentare WHERE post_id = $ id', aber nur wenn Sie _-> comments' aufrufen/fragen Wenn Sie alle Beziehungen gleichzeitig laden wollen, lesen Sie [Eloquent's Eager Laden] (http://laravel.com/docs/eloquent#eager-loading). – trm42

3

Mithilfe von Modellen und Eloquent können Sie auch benutzerdefinierte Funktionen in Ihrer Modellklasse schreiben, um allgemeine Operationen auszuführen, z. Ausgeben eines Paares verketteter Felder.

zum Beispiel:

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

Das können wir mit den Funktionen von getXAttribute() noch weiter machen. ZB: getFullNameAttribute() dann können wir einfach $ user-> fullName machen. – euantorano

+0

@euantorano In der Tat, guter Punkt! –