【初心者向け】LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第２回: MySQLに接続】

こんにちは。
ITエンジニアの濱辺(ハマベ)です。

前回に引き続き、お気に入りの動画を共有できる、SNSのようなアプリを作っていきます。

今回は、MySQLにデータ登録できるようにするところまでやっていきます。

## 前提条件
MacOS 11.2
PHP 7.4.2
Laravel 6.20.34
Docker
MySQL

↓第一回はこちら
[LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第１回】](https://qiita.com/dogabon20/items/a5574360a0b05c112048)

↓こちらの画面定義書のものを作っていきます。
[Youtube-Curation 画面定義所 (googleスプレッドシート)](https://docs.google.com/spreadsheets/d/1BglTVpnsappqNFoNTnmr1NfkRqT47VFF_u4Z4MvAu3w/edit#gid=68179162)

## Model構築

まずはMVCモデルの「M」Modelを作っていきます。
[MVCモデルとは](https://www.geekly.co.jp/column/cat-technology/1911_040/)

今回のアプリケーションでは、主に下記の２種類のモデルが登場します。

- ユーザ(利用者)モデル
- ムービー(動画)モデル

まずは、ユーザモデルを構築していきます。

このアプリはいろいろなユーザさんが利用されることを想定して作ります。

なので、大量のユーザの名前・メールアドレスなどをデータベース上に保存する必要があります。

そのユーザ情報を保存するに当たって肝心なのが、ユーザモデルです。
ログインに使用する情報なので、しっかり作らないとサービスが成り立ちません。

重要な項目なので、しっかり確認しながら作っていきましょう。

## 最大文字数の制限設定

`app/Providers/AppServiceProvider.php`を開きましょう。

bootという関数の中身に以下を追記します。

```
public function boot()
{
    \Schema::defaultStringLength(191); //追記
}
```

DBにMySQLを選択した場合、(バージョンにもよるが)**最大文字数を191以内にしないとマイグレーション時にエラーしてしまいます。**

## マイグレーション実行

**データベースとあなたのプロジェクトを全く同じ構造で作成しないと、それぞれが上手く動作しなくなります。**
そこで便利なのが、**マイグレーション機能**です。

マイグレーションファイルと呼ばれるファイルを作成してマイグレーションを実行することで、
マイグレーションファイルに書かれたテーブルの定義がMySQLなどのデータベースに反映されるのです。

また、マイグレーションファイルは履歴として残るので、やっぱり昨日の状態に戻したい…。といった時に、それが可能になります。

## ユーザテーブルのマイグレーション

ユーザテーブルのマイグレーションファイルは、実はLaravelに標準として備わっています。すでに、あなたがDLしたLaravelに存在するのです。

`database/migrations/2014_10_12_000000_create_users_table.php`を開いてみましょう。

```2014_10_12_000000_create_users_table.php(一部抜粋)
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}
```

上記のようなコードが書かれているはずです。
`$table->string('name');`はString(文字列)型のnameというカラムを作れ、という司令です。他のコードもほとんど似たような意味です。
[マイグレーションファイルについて詳しくはこちら](https://qiita.com/shosho/items/a5a5839735dfef9214b1#:~:text=%E8%A1%8C%E3%81%86Schema%3A%3Atable()%EF%BC%89-,%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%A7%8B%E6%88%90,-%3C%3Fphp%0A%0Ause%20Illuminate)

では、早速マイグレーションを実行してみましょう。
下記コマンドを実行してみてください。

```
% docker-compose exec app bash //コンテナに入る
# php artisan migrate

Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
```

ユーザテーブルの実行と同時に実行される、create_password_resets_tableというのは
パスワードリセット用のマイグレーションファイルです。

## 試しにユーザ登録してみよう

Userモデルは、Laravelに標準で用意されています。
`app/User.php`を見てみましょう。

```app/User.php(一部抜粋)
class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
```

細かな点は省きますが、`$fillable`に入っている要素(今回はname,email,password)を登録できるようになっています。

また、`$hidden`は、表示するべきではないデータを隠すために使われます。試しにtinkerでユーザ登録してみます。

```
# php artisan tinker

>>> use App\User

>>> User::create([
... 'name' => 'sample',
... 'email' => 'sample@email.com',
... 'password' => bcrypt('sample')])
=> App\User {#4188
     name: "sample",
     email: "sample@email.com",
     #password: "$2y$10$ltbjNuCqv143BqpAisENpe22KlIAvPdDfCRUBKzbqJOiIHKeCU1wi",
     updated_at: "2021-10-02 03:46:26",
     created_at: "2021-10-02 03:46:26",
     id: 1,
   }

>>> $user = User::find(1)
=> App\User {#3306
     id: 1,
     name: "sample",
     email: "sample@email.com",
     email_verified_at: null,
     #password: "$2y$10$ltbjNuCqv143BqpAisENpe22KlIAvPdDfCRUBKzbqJOiIHKeCU1wi",
     #remember_token: null,
     created_at: "2021-10-02 03:46:26",
     updated_at: "2021-10-02 03:46:26",
   }
```

#password と #remember_tokenについている'#'は、rootユーザにしか表示されないことを表しています。

今回作成したデータは必要ないので、削除しておきます。

```
>>> $user->delete()
=> true
>>> $user=User::find(1)
=> null
```

#### シーディングで一括データ登録

データを一つずつ登録するのは手間なので、「シーディング」で一括登録できるようにします。

```
# php artisan make:seeder UsersTableSeeder
Seeder created successfully.
```

すると、`database/seeds/UsersTableSeeder.php`が作成されます。

作成されたファイルに下記を記述しましょう。

```UsersTableSeeder.php
    public function run()
    {
        //以下を追記
        DB::table('users')->insert([
            'name' => 'sample1',
            'email' => 'sample1@sample.com',
            'password' => bcrypt('sample1')
        ]);
        DB::table('users')->insert([
            'name' => 'sample2',
            'email' => 'sample2@sample.com',
            'password' => bcrypt('sample2')
        ]);
        DB::table('users')->insert([
            'name' => 'sample3',
            'email' => 'sample3@sample.com',
            'password' => bcrypt('sample3')
        ]);
        DB::table('users')->insert([
            'name' => 'sample4',
            'email' => 'sample4@sample.com',
            'password' => bcrypt('sample4')
        ]);
        DB::table('users')->insert([
            'name' => 'sample5',
            'email' => 'sample5@sample.com',
            'password' => bcrypt('sample5')
        ]);
    }
```

また、同フォルダの中にある、`DatabaseSeeder`を見てみましょう。
関数`public function run()`の中に、コメントがあると思うので、それを有効にします。

```DatabaseSeeder.php
    public function run()
    {
        $this->call(UsersTableSeeder::class);
    }
```

では、seederを実行してみます。

```
# php artisan db:seed --class=UsersTableSeeder
Database seeding completed successfully.
```

tinkerを使って、ちゃんと登録されているか見てみましょう。

```
>>> use App\User
>>> User::all()
=> Illuminate\Database\Eloquent\Collection {#3623
     all: [
       App\User {#3991
         id: 1,
         name: "sample1",
         email: "sample1@sample.com",
         email_verified_at: null,
         #password: "$2y$10$UPYeRAW10Mawq/tg1Ao/geKAUMkFHJhQofo1NZQsbSqkbX50PZZx6",
         #remember_token: null,
         created_at: null,
         updated_at: null,
       },
       App\User {#4238
         id: 2,
         name: "sample2",
         email: "sample2@sample.com",
         email_verified_at: null,
         #password: "$2y$10$vhJywRf0mJmQl9ijLwQQau/1myd5lZITTrm4gUSzVvLrYO8aCkx1S",
         #remember_token: null,
         created_at: null,
         updated_at: null,
       },
       App\User {#4239
         id: 3,
         name: "sample3",
         email: "sample3@sample.com",
         email_verified_at: null,
         #password: "$2y$10$8GQtzkSyWlIjnUXNpNC4HeEsRmJjaZXkaG14Y9QTZXIYlyDsvrr0e",
         #remember_token: null,
         created_at: null,
         updated_at: null,
       },
       App\User {#4240
         id: 4,
         name: "sample4",
         email: "sample4@sample.com",
         email_verified_at: null,
         #password: "$2y$10$PuQvQrd9bJBK9H.Tt5oud.AAldX.97vuaY12ObOGW4vK1u.fYvWxu",
         #remember_token: null,
         created_at: null,
         updated_at: null,
       },
       App\User {#4241
         id: 5,
         name: "sample5",
         email: "sample5@sample.com",
         email_verified_at: null,
         #password: "$2y$10$5iPPlCY1mMqh64gDBCKzteUehlVPT4Yxw3.2Sr.Iy92vK.JxoSg6C",
         #remember_token: null,
         created_at: null,
         updated_at: null,
       },
     ],
   }
```

ユーザ登録が実行されていることが確認できました。

## 第２回おわり

前後編くらいで終わるかな、と思ったのですが、結構長くなりそう…😅

第3回は、新規ユーザ登録機能を実装していきます😄

↓第３回はこちら
[LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第3回: Laravel】](https://qiita.com/dogabon20/items/4133b65637dc7f60530d)