ホーム » Laravelでデータベースを扱う方法について

Laravelでデータベースを扱う方法について

Eloquentとは?

データベースの操作を楽にするためのORMという仕組みになります。
ORMとは、オブジェクトとデータベースを紐付ける仕組みになります。
Eloquentを利用するとSQL文を書かなくてもデータベースを操作する事が出来ます。
例えば下記の様なSQL文を利用した場合を考えます。

 SELECT * FROM books; 

Eloquentだと上記のSQLは下記で表現できます。

Book.all();

Bookテーブルを全て取得する。
という感じで、感覚的に理解できないですか?
これが、Eloquentになります。

クエリビルダとは?

メソッドチェーンを利用してSQL文を組み立てられる仕組みの事を言います。
メソッドチェーンとは、メソッドを繋げる下記のような仕組みを言います。

$query->latest()->get()

クエリビルダは、DBファザード「\Illuminate\Suuport\Facades\DB」を利用します。
例えば下記の様なSQL文を利用した場合を考えます。

 SELECT * FROM books; 

クエリビルダだと上記のSQLは下記で表現できます。

DB::table('books')->get();

クエリビルダの場合は、「DB::table(‘books’)

Eloquentとクエリビルダの違いとは?

・Eloquentは、クエリビルダのメソッドが全て利用出来ます。(これは、eloquentは内部的にクエリビルダを利用しているためです。)
・リレーション定義が出来る。
・Eloquentはモデルの作成が必須です。

// モデルがなくてもアクセス出来る
DB::table('migrations')->find(1);

// これはエラーになる。
Migration::find(1);

・タイムスタンプが更新される

// ■eloquent
// updateda_atの日付が更新されている
$book = Book::find(1);
$book->name = "test2";
$book->save();

$book = Book::find(1);

// ■クエリビルダ
// updated_atの日付が更新されない
$book = Book::find(1);
DB::table('books')->where('id', 1)->update(['name' => 'test3']);
$book = Book::find(1);

・戻り値が違う

// クエリビルダは、戻り値がstdClassのオブジェクト、またはそのCollectionで返ってくる。
// stdClassとはPHP標準で搭載されているClassで、プロパティやメソッドが一切定義されていないクラスの事です。
// クエリビルダ
// ■stdClass
DB::table('books')->find(1);

$tag= new stdClass();
$tag->name= 'test';
echo $tag->name;

// ■collection
Book::where('id', 1)->get();
DB::table('books')->all();

// Eloquent
// Eloquentは、戻り値がモデルオブジェクト、またはそのCollectionで返ってくる。
// ■eloquent
Book::all();

// ■モデルオブジェクト
Book::find(1);

クエリビルダ使う場合
sql文に慣れている場合。

Eloquent使う場合
楽にsql文を書きたい場合。クエリスコープ、リレーションを使いたい場合。

個人的な意見としては、特に理由がない場合は、Eloquentを使うべきだと考えてます。