当ブログのおすすめ記事はこちら!
  • 【学生でもできる】エンジニアとして海外ノマドワークをする方法と実際に感じたこと

【Laravel】SQLをLaravelで直接使う事案

SHARE

【Laravel】SQLをLaravelで直接使う事案



laravelのクエリビルダ(https://readouble.com/laravel/5.6/ja/queries.html)はとても便利。

だって

 

DB::table('users')->insert(
    ['email' => '[email protected]', 'votes' => 0]
);

SQLなんか書かなくてもこれだけでinsertできてしまう。けど、この方法に慣れてしまいすぎると不測の事態に対応できなくなってしまう可能性があります。(フレームワークからいきなり始めた人に多い)

SQLはそんなに難しくないので、無しでも書けるようにしておくと吉ですね。

 

SQLを直接書きたい事案

 

例えば、insertする時にプライマリーキーが被ってしまうレコードがあると

 

Duplicate entry '0' for key 'PRIMARY'

 

といったエラーが発生します。なんで、この被った時は挿入したくないって時はignoreが便利だったりします。クエリビルダのinsertにはignoreが設定されていないので、直接書くしかありません。

 

INSERT IGNORE INTO tbl_name (col_name1, col_name2, ...)
  VALUES (value1, value2, ...);

 

!!注意!!

この時auto_incrementが設定されているカラムが存在すると、ignoreで飛ばしているレコードの文もカウントされてしまうので、番号が飛び飛びになってしまいます!注意しましょう、

 

SQLを直接書く方法

 

クエリビルダに則って書くと

 

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
->get()

と書くと良いとのこと。rawとすると前のメソッドに依存するみたい。

ちな今回のようにinsertしたい場合は

 

DB::insert('insert ignore into users (id, name) values (?, ?)', [1, 'Dayle']);

 

みたいに書けばよし(上の文はもっとSQL直接感isある)

ちなみにselectの場合だと

 

DB::select("SELECT * FROM users");

 

deleteだと

 

DB::delete('delete from users WHERE id = ?' [1]);

 

updateだと

 

DB::update('update users set votes = 10 where name = ?', [‘Dale’]);

SQLを書かなくてもいい事案

 

例えばinner joinを書きたい時は直接書く必要はないですね。

 

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

このように書けるので、、

まあ有名なやつはクエリビルダに入ってるけど、ちょいマイナーなのは入っていないということでしょう。

利用の有無は

https://readouble.com/laravel/5.6/ja/queries.html

で常に確認するようにしましょう。



スポンサードリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です