【PHP(Laravel)】DBから値を抽出するSQL文の種類と違い
【PHP(Laravel)】DBから値を抽出するSQL文の種類と違い
検索流入があって記事が薄いものを補填していく流れの中の1つ。
今回は『Laravel×SQL文』についてです。
Laravelでは大別して2種類の書き方が出来る
- Eloquentで書く
- PHPのSQL文で書く
どちらもちゃんと動きます。
ただ、色々やってみた結果JOINがある場合はeloquentの方が圧倒的に速いです。
理由はModelsで書いたテーブルの関連性が事前準備されているからでしょう。
なので、LaravelではEloquentで記載する事がセオリーとなります。
クエリビルダを使わない場合(PHPのSQL文で書く)
1 2 3 4 |
// select $results = \DB::select('select * from users where id = ?', [1[); // insert \DB::insert('insert into users (id, name) values (?, ?)', [1, 'hoge']); |
違うと事は最初の呼出しでDBと動作をコールする事です。
DBのSelectを使うよと宣言してからPHP従来のselect文を記載します。
Joinなども従来通りで使います。
Eloquentと併用すると混乱してくるのは【テーブル名】のコールの仕方。
\DBを使った場合はテーブル名をそのまま記載しますが、Eloquentではモデル名を記載します。
その為、上の例ではテーブル名が複数形(Laravel命名規制により)になっています。
Eloquentの基本的な書き方
1 2 3 4 5 |
#where抽出の場合 $array = Model名::where('カラム名',値)->get(); #具体例 $array = saledata::where('salesdate',today())->get(); |
変数名を書いてモデル名と抽出条件を記載する。簡単ですよね。
EloquentでJoinはどうするのか
JoinはModelに記載します。
感覚としてはデータ連携の事前準備といった感じです。
PHPでのJoin文の場合、INNER JOIN(内部結合)/LEFT JOIN(外部結合)/RIGHT JOIN(外部結合)などありますが 、Modelにリレーションを記載した場合、基本的に外部結合になると考えていいと思います。
その為、リレーション先のテーブルで抽出した条件を持たせたいときはfunctionを利用して抽出します。
1 2 3 4 |
$array = saledata::where('salesdate',today()) ->WhereHas('product',function($search) use($product_id){ $search->where('id',product_id); })->get(); |
Modelでのリレーション事前準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Brand extends Model { public function Product() { return $this->belongsTo('App\Models\Product'); } /* バリデータ */ protected $guarded =array('id'); public static $rules = array( 'name' => 'required', 'kana' => 'required' ); private $errors; public function validate($data) { $v = Validator::make($data, $this->rules); if ($v->fails()) { // この部分注意 $this->errors = $v->errors(); return false; } return true; } public function errors() { return $this->errors; } } |
基本的な書き方はこんな感じです。
上の例の12行目【 return $this->belongsTo(‘App\Models\Product’);】 belongsTo の部分を変えていくことで様々なリレーションに対応できます。
『1対多』リレーション
親テーブル:hasMany
子テーブル:belongsTo
『1対1』リレーション
両テーブル共に:hasOne
『多対多』リレーション
中間テーブルが必要になります。詳しくは過去記事で。
事前準備が正しければJOINする必要はない
モデルでの指示が正しく、全て網羅していればEloquentでJOINしなくてもViewやControllerでリレーション先の値を取得する事が出来ます。
1 2 3 4 5 6 7 8 |
#salesdata と product がリレーションされているとして #今日の販売履歴を取得する $array = saledata::where('salesdate',today())->get(); #今日販売された商品のJANコードを取得する foreach($array as $arr){ $values[] = $arr->product->jan; } |
こんな感じで【->(アロー)】を使って取得したい情報を持つリレーションモデル名->カラム名を指示するだけです。
Modelで書いていないテーブルとJOINする
Modelで関連付けていないテーブルとJOINする事も出来ます。
1 2 3 |
$array = saledata::where('salesdate',today()) ->join('products','products.id','=','saledatas.product_id') ->get(); |
まとめ
覚えてしまうまではSelectが無い事に違和感があって「どこがSQL文かわからない」なんて思ってましたが、慣れてしまうとEloquentは超楽です。
-
前の記事
EC事業の課題の一つ『送料』と『お得感』について考えてみる 2020.10.13
-
次の記事
【Laravel(PHP)】500回/日も不正アクセスしてきたIPと接続URLを撃退する 2020.10.13
コメントを残す