【Laravel】クエリビルダ

この記事は以下の書籍を参考に執筆しました。

- [PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

#クエリビルダ
これを使うとメソッドチェーンでDBアクセスができる
##クエリビルダとは
PHPで書いてるのにSQLクエリという別言語で書いていくのってなんか違くない？
ということで用意されたのがクエリビルダ

メソッドを呼び出していくだけでDBアクセスができる。

##DB::tableとget
テーブルの全レコードを取得


###DB::table
```php5
$変数=DB::table('テーブル名');
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

####get
取得するフィールドを特定する場合は引数を利用する
例えば`get['id','name']`とすればidとnameフィールドだけを取り出せる。
省略すると全フィールドを取得

戻り値は各レコードの値をオブジェクトにまとめたものが保管される。

##特定レコードの取得
###showメソッド
```php5
$item=DB::table('people')->where('id', $id)->first();
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

####where
```php5
where('フィールド名', 値)
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


SQLの`where フィールド名=値`のような感じ

####first
最初のレコードを返す
getはすべてだがfirstは最初のものだけ

1つしかレコードが無いとわかっているものはfirstを使う


##演算記号を指定した検索
whereに3つの引数をもたせるとより複雑な検索ができる。

```php5
where(フィールド名,演算記号, 値)
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



###例
`where('id','>', 5)`とすれば
IDが5より大きいものを検索できる。
###whereとorWhere
####すべての条件に合致するものだけを検索
```php5
where(...)->where(...)
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


####条件に1つでも合致すればすべて検索
```php5
where(...)->orWhere(...)
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


##like検索
```
フィールド名 like '%テキスト%'
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


そこにどんな文字があってもOK検索
例えば%abc%ならabcの前後にどんなテキストがあってもOK
##whereRawによる条件検索
whereをいくつもつなぎ合わせるよりも条件を指定して検索できる

```php5
whereRaw(条件式,パラメータ配列)
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



```php5
    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]);
    }
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


`/show?min=20&max=50`とアクセスすればあげあ20以上50以下のものを検索する。

```
age >= ? and age <= ?
```
`?`のところにパラメータ配列が入る。
**whereRawのプレースホルダは?になる。:nameという形式ではない**

##並び順を指定
```php5
orderBy(フィールド名,'ascまたはdesc')
```

|名前|説明|
|---|---|
|asc|昇順(1234,abcd..あいうえお)|
|desc|降順(4321,dcba)|
**getメソッドの前に書く**

###例
```php5
$items=DB::table('people')->oderBy('age','asc')->get();
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


##ofsetとlimit
大量のレコードが有る場合はそこから部分的に取り出して表示するほうが楽

###指定した位置からレコードを取得
```php5
ofset(整数)
```
例えばofset(10)なら最初から10個分だけ移動して11個めから取得する
###指定した数だけレコードを収録

```php5
limit(整数)
```
limit(10)なら10個だけ取得
##insertによるレコード追加
```php5
DB::table(...)->insert(データをまとめた配列)
```

```php5
    public function create(Request $request)
    {
        $param=[
        'name'=>$request->name,
        'mail'=>$request->mail,
        'age'=>$request->age,
      ];
        DB::table('people')->insert($param);
        return redirect('/hello');
    }
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


##updateによるレコード更新

```php5
DB::table(...)->where(更新対象の指定)->update(配列);
```
>出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


updateはinsertと同じ
ただしwhereでどのレコードを更新するのかを指定してあげないとすべてのレコードが更新されてしまう

#参考文献

- >出典：[PHPフレームワークLaravel入門 第2版](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%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)