2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Laravel]Eloquent ORMとクエリビルダについて ~備忘録~

Posted at

はじめに

この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、LaravelのEloquent ORMとクエリビルダの特徴や違いについて再考したので、備忘録としてまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

Eloquent ORMとは

Eloquent ORMとは、Laravelに含まれているアクティブレコードによるデーター操作機能です。

・特徴

・Eloquentでは、ファサードの宣言は不要ですが、利用するモデル名に関してはクエリビルダと同様にuse宣言に入れる必要があります。

・特定のモデルにどのテーブルを使用するか、Eloquentに指定する必要がありません。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。

Eloquentモデルはクエリビルダとしても動作するので、クエリに制約を付け加えることもでき、結果を取得するにはgetメソッドを使用します。

複数の結果を取得するallやgetのようなEloquentメソッドの戻り値は、オブジェクト型のIlluminate\Database\Eloquent\Collectionとなっており、CollectionクラスはEloquent結果を操作する多くの便利なクラスを提供しています。
このCollectionは配列のようにループさせることもできます。

・複雑なDB操作が可能なメソッドが数多く用意されています。

・基本的な記述例

下記の例では、UserモデルとPostモデル間でリレーションがある場合を想定し、UserモデルでJunという名前のnameに該当する、Postモデルのデータを参照しています。

Eloquentでは、モデル間でリレーションがある場合、予めお互いのモデルファイルに下記のようにリレーションを定義しておく必要があります。

.php
//リレーションの定義
class User extends Authenticatable
{
 public function posts(): HasMany
    {
      return $this->hasMany('App\Models\Post');
    }
}

class Post extends Model
{
    public function user(): BelongsTo
    {
        return $this->belongsTo('App\Models\User');
    }
}

//Eloquentでのデータ取得
$user = User::where('name', 'Jun')->first( );
$posts = $user->posts;

その他、Eloquentに関する詳細は、リンク先の公式ドキュメントをお読みください。

・戻り値のデータ形式

・複数の結果を取得するallやgetのようなEloquentメソッドの場合
オブジェクト型のIlluminate\Database\Eloquent\Collectionインスタンスを返します。

findやfirst、firstWhereメソッドを使い1レコードだけを取得する場合
モデルインスタンスを返します。

クエリビルダとは

クエリビルダとは、SQL文を簡単に組み立てて、データベースの操作をしやすくしたものです。

・特徴

・Laravelでクエリビルダを使用するには、最初にDBファサードをuse宣言する必要があります。

・リレーションなどは、自分で把握して結合する必要があります。

・記述がSQL文に近い形式なので、ある程度のSQL文に関する知識が必要とされます。

戻り値はコレクション(Illuminate\Support\Collection)となっています

・基本的な記述例

クエリビルダを書く際は、まず初めにIlluminate\Support\Facades\DB;データを取り出す対象となるテーブルのモデル名をuse宣言してからDBファサードのtableメソッドを使用します。
tableメソッドは、指定したテーブルに対するクエリビルダインスタンスを返し、これを使いクエリに様々な制約を追加して、最終的な結果をget()で取得します。

下記の例では、UserモデルとPostモデル間でリレーションがある場合を想定し、UserモデルでJunというnameのidに該当する、Postモデルのデータを参照しています。

.php
use Illuminate\Support\Facades\DB;

$users = DB::table('users')
->join('posts', 'users.id', '=', 'posts.user_id')
->where('name', 'jun')
->get();

クエリビルダに関する詳細は、リンク先の公式ドキュメントをお読み下さい。

・戻り値のデータ形式

・DBファサードのtableメソッドを使いgetメソッドでデータを取得する場合
get() -> Illuminate\Support\Collectionを返す

・データベーステーブルから1レコードのみ取得するfirstメソッドの場合
first() -> stdClassオブジェクトを返す

クエリビルダとEloquentの比較

特徴 Eloquent クエリビルダ
リレーションの定義が必要 ×
Modelの定義が必要 ×
SQLの知識 あまり必要ない ある程度の知識が必要
SQLインジェクション対策
クエリビルダが利用可能

補足

・Eloquentでもクエリビルダが使用できる

Tip!! Eloquentモデルはクエリビルダですから、クエリビルダで使用できる全メソッドを確認しておくべきでしょう。
Eloquentクエリでどんなメソッドも使用できます。
Laravel6.x Eloquent

.php
//例
$user = User::find(1);

・どちらもSQLインジェクション攻撃から守られている

LaravelクエリビルダはアプリケーションをSQLインジェクション攻撃から守るために、
PDOパラメーターによるバインディングを使用します。バインドする文字列をクリーンにしてから渡す必要はありません。
Laravel6.x クエリビルダ

クエリビルダやEloquentは、アプリケーションをSQLインジェクション攻撃から守るために、PDOパラメーターによるバインディングを使用しています。

まとめ

LaravelのEloquent ORMとクエリビルダ、どちらを利用してデータ操作を実行するべきかの具体的な答えは出ていませんが、私の考えとしましてはEloquent ORMを利用したデータ操作の方が可読性が高くコードのメンテナンスもしやすいと感じた為、基本的にはEloquent ORMを利用したいと思います。

参考文献

Laravel6.x クエリビルダ
Laravel6.x Eloquent 利用の開始
Laravel6.x Eloquent Collection

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?