Eloquentとクエリビルダについて

Laravel

こんにちは!

この記事ではLaravelでデータベースを操作する際にEloquentとクエリビルダのどちらを使用したらいいのかについて検討していきたいと思います。

調べようと思った経緯としては、職場でリレーションされたテーブルの2つほどテーブルを遡ってデータを取得する処理を書く際にwhereHasメソッドを使用しており、これを調べところMySQLのパフォーマンス劣化の原因となっているDEPENDENT SUBQUERYを発生させ、処理が激遅くなるという記事を目にし、その代替案として提案されているクエリビルダの使い方を把握しておこうと思い、調べてみたという経緯になります。

早速ですが、Eloquent ORMとクエリビルダの違いについてざっくりと見ていきましょう。

クエリビルダ概要

そもそもクエリビルダとは・・・SQL文をPHPのメソッドを使う感覚で簡単に組み立てられるようにしたもの。

SQL文を生成するためのメソッドをメソッドチェーンで記述し、データベースを操作できるようにしている。

// コードイメージ
// DBファザードをuseする必要がある
$article = DB::table('articles')
              ->join('users', 'articles.user_id', '=', 'users.id')
              ->select('articles.id as article_id', 'title', 'body', 'user_id','users.id', 'users.name')
              ->orderBy('articles.created_at', 'desc')
              ->get();

Eloquent ORM概要

Eloquentとは・・・Laravelに用意されているデータベース操作のための機能でORMの一種。

ORMとは・・・Object-Relational Mappingの略称で、Modelとデータベースのテーブルをマッピングする機能のこと。

マッピングとは・・・オブジェクトとリレーショナルデータベースを対応つけること。テーブルをクラス、レコードをインスタンスとし、オブジェクトとして直感的に操作できるようにしている。

// コードイメージ
$user = User::find(1);
if(is_empty($user)){
   XXXX
}

Eloquentとクエリビルダのどちらを使えばいいのか

結論、それぞれに一長一短があるため、どちらを使うかはケースバイケースとのこと。

次に本記事の目的であるクエリビルダの使い方について少しだけ掘り下げてみます。

クエリビルダの使用方法

ここでは実例を用いてクエリビルダの使用方法を説明していきます。

まず、Twitterなんかでありそうなusersテーブルとpostsテーブルを想定します。

usersテーブル

  • id
  • name
  • created_at

postsテーブル

  • id
  • user_id
  • content
  • created_at

目的として、「2018年9月3日0時00分以降に投稿したユーザーを取得したい」とする。

クエリビルダを使用する場合、usersテーブルのidとpostsテーブルのusers_idをjoinすることで検索を行います。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class IndexController extends Controller
{
    public function index(){

        $users = User::
            join('posts', 'users.id', 'posts.user_id')
            ->where('posts.created_at', '>', '2018-09-03')
            ->select('users.*')
            ->distinct()
            ->get();

        return view('home');
    }
}

上記のように2つのテーブルをjoinメソッドで繋げることでリレーションされているテーブルのデータを持ってくるわけですね。

あとはwhereメソッドで目的のデータを絞り込み、selectやgetメソッドでデータを取得するだけです。

さて、今回はこの辺で終わりたいと思います。

読んでいただきありがとうございました!

コメント

タイトルとURLをコピーしました