Chapter5　データベースを用意する（5-1）

# モデルとデータベース

## モデルとは

でーたの管理を行うところ。
＝「データベースの処理」を担当する部分です。

データを保管庫として使うことを想定しているアプリケーションであれば、
コントローラに数行記述すれば事足りるので、
モデルを作成して設定してだと返って大変になる。

逆に多数のテーブルを連携させて複雑なでーた処理を行っているような
アプリケーションであればコントローラで扱う処理の大半がデータベース関係では、
モデルに切り離してわかりやすく求めるべきです。


## Larabelの機能

### DBクラス（クエリビルダ）

最もシンプルなアプローチは「DB」クラスを利用する方法です。

この「DB」クラスでは、
データベースにアクセスするためのクエリを生成し、
送信することができます。
SQLクエリを直接実行するイメージに近い。

### Eloquent (ORM)

ORM（Object-Relational-Mapping）と呼ばれる機能をLarabelに実装したものです。
**ORM**は、
「データベースのデータとプログラミング言語のオブジェクト言語のオブジェクトの間を取り持つ」役割があり、
「データベースのデータをシームレスに言語のオブジェクトに変換し、操作できるようにします。」

# SQLiteデータベースを準備する

Macは「SQLite」も「DB Browser for SQLite」も
標準装備しているため、インストール不要。

## DB Browser for SQLite

DB Browser for SQLiteを起動して、
「ツールでデータベースを手作業で作る」ことからやります。

# データベースファイルを作る

## テーブルを作成する

### 「people」テーブル

| テーブル項目名 | 役割 |
|:-----------|------------:|
| id      　　　　 | 保管するデータ（レコード）に割り当てる番号  |
| name    　　　　　　| 名前を保管する項目      |
| mail       | メールアドレスを保管する項目  |
| age        | 年齢を保管するための項目    |

### peopleテーブルを作る

下記のように「people」テーブルを新規作成し、
各項目をそれぞれのステータスで設定する。

![スクリーンショット 2022-07-02 22.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630260/34575b60-dea0-0bff-d794-55dc54fe3339.png)

| ステータス | 意味 | 役割 |
|:-----------|------------|:------------|
| MN      　　　　 | Not Null　  |　空であることを禁止　 |
| PK    　　　　　　| Primary Key | 　データを識別するために用意される項目　|
| AI       | Auto increment | 　自動的に値を１つずつ増やしながら設定していく機能 |
| U        | Unique   |　 同じ値が存在してはいけない |


## ダミーレコードを追加する

1. 「データ閲覧」のタブから「新しいレコードを現在のテーブルに挿入」でレコードを追加し、
   任意のレコードに変更。
2. 入力が完了したら、「変更を書き込み」をクリックして変更を保存。

![スクリーンショット 2022-07-02 23.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630260/be823d8a-c54f-24ed-7a3c-28c09e203b48.png)

## DB利用のための手続き

Larabelからデータベースを利用します。
Larabelで使用するベータベースの情報は、
「config」フォルダにある「database.php」というファイルが用意されています。

```database.php
<?php

use Illuminate\Support\Str;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Database Connection Name
    |--------------------------------------------------------------------------
    |
    | Here you may specify which of the database connections below you wish
    | to use as your default connection for all database work. Of course
    | you may use many connections at once using the Database library.
    |
    */

    'default' => env('DB_CONNECTION', 'mysql'),

    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */

    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
        ],

    ],

    **以下略**

];
```

### データベースの設定

デフォルトのデータベースを「SQLite」に変更する。

```database.php
'default' => env('DB_CONNECTION', 'sqlite'),
```

```database.php
'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
```

### `.env`の環境変数について

データベースの設定は完了ですが、もう１つ設定しておく必要があります。
Laravelの「環境変数」です。

```.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelapp
DB_USERNAME=root
DB_PASSWORD=
```
```.env
DB_CONNECTION=sqlite
```
`DB_CONNECTION`を`sqlite`に書き換え、
SQLiteでは他の環境変数は使わないため、削除します。
（そのままだと「database.php」で設定した値が有効になりません。）