Laravelクエリビルダ-JOINとLEFTJOIN


Laravelには、クエリビルダというデータベースからレコードを取得する際に、直接SQLを書かずともデータベースに問い合わせることのできる機能が備わっています。
加えてセキュリティ面においても、これらは優れていて、クエリビルダを用いることで、SQLインジェクションを意識せずにすみます。

とはいっても、Railsに親しんでいる筆者としてはSQLの知識が曖昧だったため、クエリビルダのjoinメソッドとleft joinメソッドに関して曖昧でした。そこで今回は、これらの違いを簡単にまとめてみようと思います。

なお、検証にはLaravelで対話的にプログラムを扱えるtinkerを用いて進めます。
それでは、booksとownerのテーブルを用いて解説して行きます。

以下のテーブルをみていただければわかownersとbooksテーブルが1対多の関係にあります。

       owners                                                                                               books   

INNER JOIN文

laravelにて、inner join文を使用するには、クエリビルダインスタンスにjoinメソッドを使います。

joinメソッドの第1引数は結合したいテーブル名、それ以降の引数にはJOIN時のカラムの制約条件を指定します。

>>> DB::table('owners')-> join('books', 'owners.id', '=', 'books.owner_id') -> get():

結合条件としてownersテーブルのidとbooksテーブルのowner_idが等しいものを結合します。

inner joinの場合結合条件に一致しないデータがあった場合、その値は取得されません。いわゆる内部結合というやつです。

結果をグラフ化すると次のようになります。

booksテーブルのowner_idをみてみると、本の所有者がid 1, 3, 4の3名に限られていることがわかります。 ですので、inner joinでは、検索条件に一致していないyamadaとyokoyamaはテーブル内に表示されません。

LEFT JOIN文

同様にLaravelにてLEFT JOINを用いたいときには、クエリビルダインスタンスに対してlefjoin句を用います。同じく第1引数は結合したいテーブル名、それ以降の引数にはJOIN時のカラムの制約条件を指定します。

>>> DB::table('owners')-> leftjoin('books', 'owners.id', '=', 'books.owner_id') -> get();

left joinは、主キーのテーブルを全て返します。 inner joinの時とは異なり、結合条件に一致しないデータがあってもnullとなって結果に出力されています。 いわゆる外部結合というやつです。

まとめ

つまり、以上のことをまとめると

inner join … 結合条件に一致しないデータがある場合そのデータのあるレコードは無視して結合する

left join … 主キーのあるテーブルへ結合する。この時結合条件に一致しないデータのあるレコードの値はnullとなる

外部結合には、right joinなんかもありますが、考え方は同じで、外部キーのあるテーブルへ結合するというふうに、向きが変わるだけです。 内部結合と外部結合の考え方を押さえとけばバッチリだと思います。これに関しては、こちらのQitaの記事にうまくまとめられていたのでおすすめです。 今後もSQLを少しずつ勉強していこうと思います!!

comments powered by Disqus