2013-07-19 19 views
13

私のCodeigniterのバックグラウンドのせいで、Laravel 4のEloquent ORMを楽しんでいるとは思えません。 IDの投稿のリストを降順で並べ替えるクエリを書いてみたいとします。どのようにしてEloquentがDB::table('posts')->orderBy('id', 'desc')->get();の明瞭さを打ち消すことができますか?Eloquent(ORM)をFluent(Query Builder)で使用する場合

EloquentをFluentで使用する理由はありますか?それは主にテーブルを結合するためでしたか?

答えて

29

私はcodeigniterから来ており、これは私の経験です: 私は通常EloquentとFluentを一緒に使用します。 Eloquentは関係、CRUD操作などでうまく動作することができるものです。SQL操作を行う必要があるときは、流暢な関数を簡単に追加できます。

上記の例では、投稿テーブルがあります。あなたがポストモデルを持っている場合は、雄弁使って書かれた同じことがある:だから

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

あなたは

Model_name::some_functions 

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

と同じである雄弁よりも拡張する場合、私はそれを得るよう実際のパワーは、モデルを作成したり更新したり、コメントを投稿したりする必要があるときに発生します。それは簡単になるより:

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

答えは - あなたは流暢な関数を使用して順序付きリストを取得する必要があります。

+0

THX、ちょうど 'ポスト::見つける($ ID)のために、確認する - >コメント;' 'comments'方法、それは' POST'テーブルに対して実行する必要がありません'Post'と' Comment'テーブルの間の結合でもかまいませんか? – bitinn

+0

わかりません。あなたは投稿とコメントの表を持っています。あなたはコメントの表にpost_idを持っていますし、ポストクラスのメソッドを記述しています(関数のコメント(){return $ this-> hasMany( 'comment');}。 Post :: find($ id) - >コメントを使用してあなたの投稿にコメントを投稿することができます(投稿からのselet *はcomments.post_id = posts.idのコメントに参加します) – Victor

+0

説明として、EloquentはFluentから継承します。 'Post :: find($ id) - > comments'を実行している場合、デフォルトではjoinをしていませんが、最初に' SELECT * FROM posts WHERE id = $あなたが ' - > comments'を呼び出す/尋ねるときにのみ、' SELECT * FROM comments WHERE post_id = $ id'から投稿します。 同時にすべてのリレーションをロードする場合は、[Eloquent's Eager読み込み中](http://laravel.com/docs/eloquent#eager-loading )。 – trm42

3

モデルとEloquentを使用して、モデルクラスにカスタム関数を記述して、一般的な操作(例:いくつかの連結フィールドを出力します。例えば

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

getXAttribute()関数を使用してこれをさらに処理することができます。例:getFullNameAttribute()次に、$ user-> fullNameを実行します。 – euantorano

+0

@euantorano確かに、良い点! –

関連する問題