困りごと
PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのDBの操作方法はEloquent ORM・DBクラス・クエリビルダ
に分類されます。表示されればなんでもOKというからレベルを一段階上げていきたい初学者がこれらの違いについてまとめました。
前編:各記述法の違いについて。(今回)
後編:どのように記述法を選択していくのか(次回)
開発環境
PHP 7.2.34 / Laravel 6.20.5
記述法を比較
①DBファザードはIlluminate\Support\Facades\DB
クラスによる記述法。
②Eloquent ORMはIlluminate\Database\Eloquent\Model
クラスを継承する記述法。
それぞれ見ていきます。
###①DBクラスの記述 (DBファザード)
DBクラスによる記述のためIlluminate\Support\Facades\DB
をuseする。
use Illuminate\Support\Facades\DB;
####⭐️ DBファザード パターン①
DB::SQL値(SQL文、パラメータ配列)
のように引数に直接SQL文を用いて記述する。
SQL値にはinsertやupdateなどの基本的なSQLのメソッドは揃っている。
記述例
public function query(Request $request) {
//SELECT文
$items = DB::select('select * form users where id = ?',[1]);
//INSERT文
DB::insert('insert into users (id, name) values (?,?)',[1,'たかし']);
//UPDATE文
DB::update('update users set age = 100 where id = ?, [2]');
//DELETE文
DB::delete('delete from users');
}
Laravel公式リファレンス(DBファザード)
https://readouble.com/laravel/5.dev/ja/database.html
####⭐️ DBファザード パターン②
SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデータベースを操作する。
DB::table('テーブル名')->メソッド()
のように記述する。
記述例
・usersテーブルから、フィールド名(id)とパラメータ(requestされたid)が同じレコードを取得
public function select(Request $request) {
$items = DB::table('users')->where('id',$request->id)->first();
return view('index',['items' => $items]);
}
//DB::table('テーブル名')->where('フィールド名',パラメータ)->first()
・usersテーブルの内容をリクエストされた値へ変更(フィールド名とパラメータが同じレコードに対しての処理)
public function update(request $request) {
$param = [
'id' => $request->id,
'name' => $request->name,
'comment' => $request->commment,
];
DB::table('users')->where('id',$request->id)->update($param);
}
//DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);
Laravel公式リファレンス(クエリビルダ)
https://readouble.com/laravel/5.dev/ja/queries.html
また、クエリの中で直接SQLを使用したい場合はDB::raw
メソッドを使用する。
$users = DB::table('users')
->select(DB::raw('count(*) as count, status'))
->where('status','<>',1)
->groupBy('status')
->get();
参考:https://readouble.com/laravel/5.7/ja/queries.html
余談ですが、
DBファサードでの insert もしくは update では created_at や updated_at は更新されません。
Eloquent を利用したときのみです。
とのことです。私はこれが原因で値が保存されずにハマったことがあります。
参考:https://laraweb.net/knowledge/2347/
###②Modelクラスの記述 (Eloquent ORM)
####※Eloquent ORMの基本の考え方 例:usersテーブル
①1つのクラスがDBの1テーブルに対応 $users = User::all()
②クラスの1インスタンス(オブジェクト)は、DBの1レコードに対応 $user = new User()
③クラスの属性は、テーブルの各カラムに対応 {{$user->comment}}
####⭐️ Eloquent ORM
モデルクラスによる記述のためApp\Model名
をuseする。
use App\Models\User; //Modelsディレクトリの配下にUserモデルを生成。
記述例
・usersテーブルの全ての値を、Collection型として取得してview(index)へ渡す
public function select(Request $request)
{
$item = User::all();
return view('index',['items' => $items]);
}
・usersテーブル内でリクエストされたnameフィールドと同じ値のレコードを、Collection型として取得しview(index)へ渡す。
public function search($Request $request)
{
$item = User::where($request->name)->get(); //クラス名::where(検索する値')->取得方法
return view('index',['items' => $items]);
}
参考:
https://blog.ytake.jp.net/entry/2015/12/16/011812
https://qiita.com/gone0021/items/f1e8223c94dbaab22fca
##最後に
書き方の違いについてざっくりまとめました。書き方が多くあるが故に、僕のような初学者は選択に困ってしまう部分だと思います。理解がより深まるようにメリデメについてまとめたかったのですが、長くなってきたので後編に書きます。
この内容は奥が深いようなので、実務経験を元にさらにブラッシュアップしていきます。
(本内容に誤りがありましたらご指摘いただけると幸いです。)