ラボ > Laravel、Lumen:基本、DB関連

Laravel DB絡み

作成日:2019-03-26, 更新日:2022-12-22

基本

・「.env」にDBの接続情報の設定は必須
・困ったら「vendor\laravel\framework\src\Illuminate\Database」を漁れば何かが得られるかも。
・「vendor\laravel\framework\src\Illuminate\Database\Connection.php」が基本になるっぽい。

モデルのファイル

モデルという概念が無いそうだ。
→「app/model」を用意し、その下に各ファイルを配置で問題無いっぽい。

▼「app/model/hoge.php」

<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;

class hoge extends Model {
  public static function getOne() {
    // クエリとか。
  }
}

※「use」は決め打ちで必須っぽい。

クエリの実行

・クエリビルダが色々と用意されているが、色々と面倒なので「クエリを実行」っていうクエリビルダを使う。
※「DB::table($this->table)->get();」とかでselect文実行ってのは簡単なんだけど、条件が複雑になっていくと面倒。

select文

// 全件
DB::select("SELECT * FROM 〇〇〇");

// 1件のみ
DB::selectOne("SELECT * FROM 〇〇〇");

→戻り値はobject型。結果が無ければ空の配列。

insert文

DB::insert('insert into 〇〇〇 (〇〇, 〇〇) values (〇〇, 〇〇)');

update文

DB::update('update 〇〇〇 set 〇〇=〇〇 where 〇〇=〇〇');

delete文

DB::delete('delete from 〇〇〇 WHERE 〇〇=〇〇');

その他

上記のクエリ以外のクエリを実行したいとき・・・全部「statement()」で良いような気もする・・・

DB::statement('drop table 〇〇〇');

Bind / SQLインジェクション対策

▼「?」を使って前から順番にBindさせる

$q    = 'select *'
      . ' from 〇〇〇'
      . ' where id=?';
$bind = array(
          1
        );
DB::select($q, $bind);

▼「:」を使ってキーと紐づけてBindさせる

$q    = 'select *'
      . ' from 〇〇〇'
      . ' where id=:id';
$bind = array(
          'id' => 1,
        );
DB::select($q, $bind);

最後に実行したクエリ(last_query())

Laravelにはそんな便利な機能は無い。

代替えとして「getQueryLog()」ってのがある。
→bindしている分は値は埋め込まれる前のクエリになる。

// ログの取得
\DB::enableQueryLog();

$q    = 'select * from 〇〇〇 where id=:id';
$bind = array('id'=>1);

// クエリの実行
$list = \DB::select($q, $bind);

// クエリとbindの値と時間を取得
var_dump(\DB::getQueryLog(););

// ▼結果
//array (
//  0 => 
//  array (
//    'query' => 'select * from 〇〇〇 where id=:id',
//    'bindings' => 
//    array (
//      'id' => 1,
//    ),
//    'time' => 〇〇,
//  ),
//)

※「\DB::disableQueryLog()」ってのも用意されているので明示的にログの取得を止めるコトも可能っぽい。
※「\DB::flushQueryLog()」ってのがいて、コイツはログをクリアしてくれるみたい。

pdoの関数を使いたい

▼「\db::getPdo()」がpdoのオブジェクトになっている。

\db::getPdo()->〇〇〇;

トランザクションと例外処理

try {
    \DB::beginTransaction();
    
    ~ 処理 ~
    
    \DB::commit();
}
catch (\Exception $e) {
    \DB::rollback();
}

※「use DB;」を記載しといてやれば「\DB::ooo」は「DB::ooo」と記載可能。