LaravelのDBクラス【個人的なお勉強アウトレット】

# 参考図書
https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582

DBクラスにはデータベースを利用するためのさまざまな機能が用意されている。
- SQLのクエリを直接実行するメソッド
- クエリビルダ

## SQLのクエリを直接実行するメソッド
### select文の例
コントローラーの記述
```app/Http/Controllers/HtelloController.php
use Illuminate\Support\Facades\DB;

public function index(Request $request){
$items = DB::select('select * from people');
return view('hello.index', ['items' => $items]);
}
```
`DB::select('実行するSQL文')`はDBクラスにある静的メソッド。
レコードの情報が戻り値として返される。

テンプレートの記述
```resources/views/hello/index.blade.php
@section('content')
@foreach($items as $item)
{{$item->name}}
{{$item->mail}}
{{$item->age}}
@endforeach
@endsection
```

同じようにinsert、update、deleteもDBクラスの静的メソッドとして用意されている。

### パラメータ結合
文字列とパラメータ配列を組み合わせてSQL文を作成する方法
/hello?id=番号にアクセスすると、そのID番号のレコードを検索して表示
```app/Http/Controllers/HtelloController.php
public function index(Request $request){
if(isset($request->id)){
$param = ['id' => $request->id];
$items = DB::('select * from people where id = :id',$param);
}else{
$items = DB::select('select * from people');
}
return view('hello.index', ['iteems' => $items]);
}
```
`:id`でブレースホルダを用意している箇所に、2引数の$param配列から'id'の値を取り出してはめ込んでいる。

## クエリビルダ
SQLクエリ文をデータベースを操作するやり方はSQL文がわかっていれば簡単。だけどあまりいい方法とはいえない。
SQL文にパラメータ配列の値を組み込んで文を生成するため、SQL文が正しくできているのかわかりづらい。また、渡される値の内容によっては予想外のSQL文が実行されてしまう危険もある。（SQLインジェクション）
そもそも、PHPのプログラムに、データベースの部分だけは別の言語で書かないといけないのがストレス。

そこで用意されたのがクエリビルダ。クエリビルダとはSQLのクエリ文を生成するために用意されたメソッドのこと。
さまざまな要素を表すメソッドをメソッドチェーンとして連続して呼び出していくことで、SQLクエリ文を内部で生成し、実行する。
生成されるSQLクエリ文は表面に表れることなく、PHPの処理としてメソッドをメソッドを呼び出していくことでデータベースアクセスが実現する。

### レコードを取得して表示する例(selectの例)
コントローラーの記述
```app/Http/Controllers/HtelloController.php
public function index(Request $request){
$items = DB::table('people')->get();
return view('hello.index,['items'=> $items]);
}
```
### DB::tableについて
`$変数 = DB::table(テーブル名);`
指定したテーブルの「ビルダ」を取得する。ビルだは、Illuminate\Database\Query名前空間にあるBuilderクラス。
SQLクエリ文を生成するための機能を提供する。
DB::tableビルだを用意し、このビルだの中に用意されているメソッドを呼び出していくことで、ビルダの具体的な設定を行ったり、テーブルの操作が行ったりできる。

### get::について
テーブルにあるレコードを取得するSQLのselect文に相当するもの。
実行結果はコレクションになっていて、取得sいたレコードのオブジェクトがまとめられている。
`get(['id','name'])`とすればidとnameフィールドだけを取り出せる。

### 指定したIDのレコードを得る
/show?id=番号にアクセスすると、そのID番号のレコードを検索して表示
```app/Http/Controllers/HtelloController.php
public function show(Request $request){
$id = $request->id;
$item = DB::table('people')->where('id', $id)->first();
return view('hello.show', ['item' => $item]);
}
```
#### where
whereはSQLのwhere句に相当するもの。引数にフィールド名と値を指定することで、指定した条件に合致するレコードを絞り込む。
`where(フィールド名,値)`

演算子を使う場合は
`where(フィールド名,演算記号,値);`

すべての条件に合致するものだけを検索したい場合
メソッドチェーンで続ける
`where(...)->where(...)`

条件にひとつでも合致すればすべて検索
`where(...)->orWhere(...)`

Like検索の場合・・・
```
->where('name', 'like', '%' . $name . '%')->orWhere('mail', 'like', '%' . $name . '%')
```
nameかmailに検索テキストが含まれているものを探す

whereRowによる条件検索
検索条件が複雑になった場合は、whereRowメソッドのほうが役立つかも。
`whereRow(条件式, パラメータ配列)`;`
```app/Http/Controllers/HtelloController.php
public function show(Request $request){
$min = $request->min;
$max = $request->max;

$items = DB::table('people')->whereRaw('age >= ? and age <= ?'),[$min, $max])->get();
return view('hello.show',['items'=>$items]);
}
```
whereRawのプレースホルダは`?`。

#### first
firstは最初のレコードだけを返すメソッド。getは検索されたレコードをすべてを返す、firstは最初のものだけ。
1つしかレコードがないことがわかっている場合はfirstを使うことが多い。一つしか無いので戻り値は配列やコレクションではなくオブジェクト。

### orderBy
`orderBy(フィールド名, 'ascまたはdesc')`
昼飲点として、getメソッドの前に書いて置かなくてはいけない。

### offsetとlimit
offsetは指定した位置かれレコードを取得する
例えばoffset(10)とすると、最初から10個文移動し、11個目からレコードを取得する。
`offset(整数)`

limitは指定した数だけレコードを取得する
`limit(整数)`

この２つを組み合わせることで必要な部分だけを取り出せるようになる。
```app/Http/Controllers/HtelloController.php
public function show(Request $request){
$page = $request->page;
$items = DB::table('people')->offset($page * 3)->limit(3)->get();
return view('hello.show', ['items'=>$items]);
}
```
パラメーターの数字に*3したところから3つのレコードを取得。

### insert
`DB::table(...)->insert(データをまとめた配列)`
```app/Http/Controllers/HtelloController.php
public function add(Request $request){
return view(hello.add);
}

public function create(Request $request){
$param = [
'name' => $request->name,
'mail' => $request->mail,
'age' => $request->age,
];
DB::table('people')->insert($param);
return redirect('/hello');
}
```
### update
```app/Http/Controllers/HtelloController.php
`DB::table(...)->where(更新対象の指定)->update(配列)`
public function edit(Request $request){
$item = DB::table('people')->where('id', $request->id)->first
}

public function update(Request $request){
$param = [
'name' => $request->name,
'mail' => $request->mail,
'age' => $request->age,
];
DB::table('people')->where('id', $request->id)->update($param);
return redirect('/hello');
}

```
### delete
`DB::table(...)->where(更新対象の指定)->delete();`