【ローカル環境】Laravelアプリ作ってローカルDB（MAMP）にテーブル作るまで

Laravelでいろいろなハンズオン形式の練習をしていくにあたり、
アプリ作成からテーブル作成まで、毎回ちょっと調べるのが面倒になってきたのでまとめます。

#前提環境/どんな方向け？
・mac OS 10.15（10.14や10.13でも大きな違いはなし）
・MAMPをmacにインストール済みであること。
・ターミナル操作がわからないこともないこと。
・Laravelはmacにインストール済みであること。
・composerも入れていること。

という感じで、しょっぱなからの説明ではなく、過去にlaravelをmampで構築されており、ローカル環境で新しくアプリを作る方向け（主に自分の備忘録）です。

##手順

###1.Laravelアプリを作る
まずはアプリ作成。「todoLife」というアプリを作る場合は下記の手順。
ターミナルで、

**composer create-project "laravel/laravel=5.8.*" todoLife**

※バージョン指定は任意です。不要な場合は「laravel/laravel」でokです。
ここでは5.8の中の最新版を指定してみます。

また、このコマンドを行うことで、「今いる場所」にフォルダ/プロジェクトを作ります。
例えばデスクトップに「todoLife」というフォルダを作り、その中にcdで移動して上記のコマンドを実行すると
desuktop/todoLife/**todoLife** （← laravelのアプリ）
という感じになっちゃいます。
ので、desktopに作りたい場合はデスクトップに移動して実行しましょう。
（この後すぐmamp内に移動しますが）

###2.MAMP内に移動
作ったララベルプロジェクトをmampの中のhtdocsに移動しましょう。
具体的には下記のような配置となります。

**Macintosh ハードディスク/Applications/MAMP/htdocs/プロジェクタフォルダ**

phpデータをローカルのmampで表示、動作させるにはこの「htdocs」の中に保管している必要があります。


###3.DBを作る
MAMPで予めDBを作っておきます。
開発環境ではあるので大体でもいいかもですが、アプリ名と同じにしているケースが多いです。

MAMPの中でnewから作成しましょう。
※照合順序は「utf8_general_ci」でokです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/ae2c0e35-cab0-7ccc-17a9-deeb28002534.png)


##4.テーブルを作る
手動でMAMP内で作ってもいいですが、ここではlarabelのマイグレーション機能で作ってみます。今回作るのはシンプルに「todo」のテーブル「todos」です。

※なお、laravelのプロジェクト > database > migrations の中にデフォルトで存在している

2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php

は、ユーザーテーブルやパスワードリセットが不要ならば削除しても問題ないです。

####マイグレーションとは？
マイグレーションを行うことにより、このmigrationsファイルの中の「up()」の処理を実施します。
この後マイグレーションファイルの中身を見ますが、これらのファイルのupでは、テーブルを作るという処理が書かれています。
そのため、デフォルトの状態でマイグレーションをすると、前述の既存の二つのファイルにより、「ユーザーテーブル」と、「パスワードリセットのテーブル」が作られる、ということになります。

今回はそのままにしておき、マイグレーションファイルを別途作ります。
作る方法は、ターミナルでプロジェクトフォルダのトップにいるときに

**php artisan make:migration create_todos_table --create=todos**

と実施します。
ここで中盤と最後にある「todos」が、作成するファイル名、テーブル名になります。
テーブル名は通常複数形として作成する必要があります。postなら「posts」などです。

次にmigrationsの中にできた記述を見てみましょう。こんな関数ができているはずです。

```2020_xx_xx_123630_create_todos_table.php

class CreateTodosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('todos');
    }
}


```
up()が、migration実行時に作られるテーブルの情報、そして
down()がやっぱその処理をやめるときに巻き戻す（ロールバック時に）実行される処理です。

今回、各todosには題名と本文をつけたいので、こんな感じでtitle、bodyテーブルを作る記述を追加します。

```php

    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title',50);//追加
            $table->text('body');//追加
            $table->timestamps();
        });
    }

```

それでは、下記の手順でマイグレートを実行します。

**php artisan migrate**

む。エラーとなりました。
![スクリーンショット 2020-09-22 22.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/c433f367-0000-2eb0-d0c4-b9d96b511302.png)

##5.環境設定
DBとの接続設定をまだ行っていませんでした。
その辺の環境設定は.envファイルで行います。
.envはプロジェクトのトップディレクトリ直下に存在しています。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/b36d2e20-975d-600b-56a7-319a1e9b6042.png)
いじるのはこの辺。

```php

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=todoLife //アプリ名に変更
DB_USERNAME=root
DB_PASSWORD=root //パスワードを設定。mamp側でDBにログインするためのユーザーごとのid、パスワードを設定します。


```

config/app.php
config/database.php
というファイルも編集します！

```php
//app.php
//タイムゾーンと言語設定を変更しておきましょう。
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja',
```

```php
//database.php
//database名、ユーザーネーム、パスワード、unix_socketを修正します。

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'todoLife'),//修正
            'username' => env('DB_USERNAME', 'root'),//修正
            'password' => env('DB_PASSWORD', 'root'),//修正
            'unix_socket' => env('DB_UNIX_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),//修正


```

##6.もう一度マイグレーション
今度は成功しました！
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/9f446004-56de-d0cc-2541-952a7b436bd4.png)

mampを見てもちゃんとtodos、users、passwordresetテーブルがつくられています。
![スクリーンショット 2020-09-22 22.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/d4e354f4-7307-60bd-53ec-fdaa3ad28de2.png)

終わり！

##おまけ
マイグレーションしてなくても見れますが、プロジェクトフォルダでphp artisan serveして、
mampを起動しておけばlaravelの起動も確認できます！
![スクリーンショット 2020-09-22 22.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/af9f8d49-beb6-c66e-2d46-7bef03a7af9a.png)