【PHP(Laravel)】DBから値を抽出するSQL文の種類と違い

【PHP(Laravel)】DBから値を抽出するSQL文の種類と違い

【PHP(Laravel)】DBから値を抽出するSQL文の種類と違い

検索流入があって記事が薄いものを補填していく流れの中の1つ。

今回は『Laravel×SQL文』についてです。

Laravelでは大別して2種類の書き方が出来る

  1. Eloquentで書く
  2. PHPのSQL文で書く

どちらもちゃんと動きます。
ただ、色々やってみた結果JOINがある場合はeloquentの方が圧倒的に速いです。

理由はModelsで書いたテーブルの関連性が事前準備されているからでしょう。
なので、LaravelではEloquentで記載する事がセオリーとなります。

クエリビルダを使わない場合(PHPのSQL文で書く)

違うと事は最初の呼出しでDBと動作をコールする事です。
DBのSelectを使うよと宣言してからPHP従来のselect文を記載します。
Joinなども従来通りで使います。

Eloquentと併用すると混乱してくるのは【テーブル名】のコールの仕方。
\DBを使った場合はテーブル名をそのまま記載しますが、Eloquentではモデル名を記載します。
その為、上の例ではテーブル名が複数形(Laravel命名規制により)になっています。

Eloquentの基本的な書き方

変数名を書いてモデル名と抽出条件を記載する。簡単ですよね。

EloquentでJoinはどうするのか

JoinはModelに記載します。

感覚としてはデータ連携の事前準備といった感じです。

PHPでのJoin文の場合、INNER JOIN(内部結合)/LEFT JOIN(外部結合)/RIGHT JOIN(外部結合)などありますが 、Modelにリレーションを記載した場合、基本的に外部結合になると考えていいと思います。

その為、リレーション先のテーブルで抽出した条件を持たせたいときはfunctionを利用して抽出します。

Modelでのリレーション事前準備

基本的な書き方はこんな感じです。
上の例の12行目【 return $this->belongsTo(‘App\Models\Product’);】 belongsTo  の部分を変えていくことで様々なリレーションに対応できます。

『1対多』リレーション

親テーブル:hasMany
子テーブル:belongsTo

『1対1』リレーション

両テーブル共に:hasOne

『多対多』リレーション

中間テーブルが必要になります。詳しくは過去記事で。

Laravel:多対多リレーション作成時の注意点

事前準備が正しければJOINする必要はない

モデルでの指示が正しく、全て網羅していればEloquentでJOINしなくてもViewやControllerでリレーション先の値を取得する事が出来ます。

こんな感じで【->(アロー)】を使って取得したい情報を持つリレーションモデル名->カラム名を指示するだけです。

Modelで書いていないテーブルとJOINする

Modelで関連付けていないテーブルとJOINする事も出来ます。

まとめ

覚えてしまうまではSelectが無い事に違和感があって「どこがSQL文かわからない」なんて思ってましたが、慣れてしまうとEloquentは超楽です。