Chapter5　DBクラスの利用（5-2）

# DBクラスとは？

Laravelに用意されている、
最もシンプルなデータベースアクセス機能は「DB」クラスです。

中でも、最もシンプルなのは、SQLのクエリを直接実行するメソッドです。

# DBクラスを使用

## コントローラの修正

```HelloController.php
use Illuminate\Support\Facades\DB;

class HelloController extends Controller
{

    public function index(Request $request) {

        $items = DB::select('select * from people');

        return view('hello.index',['items' => $items]);

    }

}
```

## テンプレートの修正

```index.php
@section('content')

    <table>
        <tr><th>Name</th><th>Mail</th><th>Age</th></tr>

        @foreach($items as $item)
            <tr>
                <td>{{$item->name}}</td>
                <td>{{$item->mail}}</td>
                <td>{{$item->age}}</td>
            </tr>
        @endforeach
    </table>

@endsection
```

上記の記述をすることで、
「people」テーブルから参照して、レコードを表示することができる。

![スクリーンショット 2022-07-03 1.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630260/2fcbd356-a679-f516-b0df-e9d8fc719c91.png)

調べている間に、参考になりなる記事があったので記載。

https://qiita.com/Soh1121/items/aad110b36b0a2f0f6648

https://qiita.com/ucan-lab/items/20a5a6ad7faea7cd622f


## `DB::select`の利用

```HelloController.php
$items = DB::select('select * from people');
```
上記がデータベースからレコードを取り出すための処理の記述。
`DB::select`は、DBクラスにある静的メソッドで、以下のように呼び出す。

```sample.php
$変数 = DB::select('**実行するSQL文**);
```

# パラメータ結合の利用

**パラメータ結合** とは、
文字列とパラメータ配列を組み合わせてSQL文を作成する方法です。

```HelloController.php
public function index(Request $request) {

        if (isset($request->id))
        {
            $param = ['id' => $request->id];
            $items = DB::select('select * from people where id = :id', $param);

        } else {

            $items = DB::select('select * from people');

        }
        return view('hello.index',['items' => $items]);
}
```

```HelloController.php
$param = ['id' => $request->id];
```
`['id' => パラメータ]`という配列を用意します。
```HelloController.php
$items = DB::select('select * from people where id = :id', $param);
```
`where id = :id`の`:id`はパラメータの値をはめ込む**プレースホルダ**を指します。


## `DB::insert`によるレコード作成

### レコード追加用のテンプレートページを作成。

```add.php
@extends('layouts.helloapp')

@section('title','Add')

@section('menubar')
    @parent
    新規作成ページ
@endsection

@section('content')

    <form action="/hello/add" method="post">

        <table>
            @csrf
            <tr><th>name: </th><td><input type="text" name="name"></td></tr>
            <tr><th>mail: </th><td><input type="text" name="mail"></td></tr>
            <tr><th>age: </th><td><input type="text" name="age"></td></tr>
            <tr><th></th><td><input type="submit" name="send"></td></tr>

        </table>

    </form>

@endsection

@section('footer')
    copyright 2020 tuyano.
@endsection
```

### コントローラへレコード追加処理の追加

```HelloController.php
class HelloController extends Controller
{

    public function index(Request $request) {

        $items = DB::select('select * from people');

        return view('hello.index',['items' => $items]);

    }

    public function post(Request $request) {

        $items = DB::select('select * from people');

        return view('hello.index',['items' => $items]);

    }

    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::insert('insert into people (name, mail, age) values (:name, :mail, :age)', $param);

        return redirect('/hello');

    }

}
```

### ルート情報の追加

addページにルーティングするように、「web.php」に登録する。

```web.php
Route::get('hello/add','App\Http\Controllers\HelloController@add');
Route::post('hello/add','App\Http\Controllers\HelloController@create');
```

## `DB::update`による更新


### 更新用テンプレートページの作成
```eidt.php
@extends('layouts.helloapp')

@section('title','Edit')

@section('menubar')
    @parent
    更新ページ
@endsection

@section('content')

    <form action="/hello/edit" method="post">

        <table>
            @csrf
            <input type="hidden" name="id" value="{{$form->id}}">
            <tr><th>name: </th><td><input type="text" name="name" value="{{$form->name}}"></td></tr>
            <tr><th>mail: </th><td><input type="text" name="mail" value="{{$form->mail}}"></td></tr>
            <tr><th>age: </th><td><input type="text" name="age" value="{{$form->age}}"></td></tr>
            <tr><th></th><td><input type="submit" name="send"></td></tr>

        </table>

    </form>

@endsection

@section('footer')
    copyright 2020 tuyano.
@endsection
```

フォームの`value`に`$form`の値を設定することで、
`$form`に更新するレコードの値を設定しておけばその値が表示されるようになります。
またレコードを更新する際に、どのレコードを更新するのか判断するための、
`<input type="hidden" name="id" value="{{$form->id}}">`で
`$form`に「id」を持たせ、どのレコードを更新するのかを判断できるようにしています。

### 更新処理の追加

```HelloController.php
public function edit(Request $request) {

        $param = ['id' => $request->id];
        $item = DB::select('select * from people where id =:id', $param);

        return view('hello.edit',['form' => $item[0]]);

    }

    public function update(Request $request) {

        $param = [

            'id' => $request->id,
            'name' => $request->name,
            'mail' => $request->mail,
            'age' => $request->age,

        ];
        DB::update('update people set name=:name, mail=:mail, age=:age where id =:id', $param);

        return redirect('/hello');

    }
```

### ルーティング情報の登録

```web.php
Route::get('hello/edit','App\Http\Controllers\HelloController@edit');
Route::post('hello/edit','App\Http\Controllers\HelloController@update');
```

## `DB::delete`による削除

### 削除用のテンプレートページを作成。

```del.php
@extends('layouts.helloapp')

@section('title','Edit')

@section('menubar')
    @parent
    削除ページ
@endsection

@section('content')

    <form action="/hello/del" method="post">

        <table>
            @csrf
            <input type="hidden" name="id" value="{{$form->id}}">
            <tr><th>name: </th><td>{{$form->name}}</td></tr>
            <tr><th>mail: </th><td>{{$form->mail}}</td></tr>
            <tr><th>age: </th><td>{{$form->age}}</td></tr>
            <tr><th></th><td><input type="submit" name="send"></td></tr>

        </table>

    </form>

@endsection

@section('footer')
    copyright 2020 tuyano.
@endsection
```

### 削除処理をコントローラに追加する

```HelloController.php
public function del(Request $request) {

        $param = ['id' => $request->id];
        $item = DB::select('select * from people where id =:id', $param);

        return view('hello.del',['form' => $item[0]]);
}

public function remove(Request $request) {

        $param = ['id' => $request->id];
        DB::delete('delete from people where id =:id', $param);

        return redirect('/hello');
}
```

### ルーティング情報を追加する

```web.php
Route::get('hello/del','App\Http\Controllers\HelloController@del');
Route::post('hello/del','App\Http\Controllers\HelloController@remove');
```

これで、でーたベース操作の基本である「CRUD」の実装はできましたが、
コントローラにSQLクエリ文をそのまま記述しただけのやり方であまりスマートではない。

次回、クエリビルダを利用するとよりＰＨＰらしい記述でDB操作ができる。