HerokuにHeroku Postgresを導入してアプリケーションを動かしてみる1

# 参考文献
[Laravelアプリをherokuで動かすチュートリアル](https://qiita.com/kamukiriri/items/73ff35fc7f9083ca68c1)
今回も上記のリンク先を参考にしてデプロイした。

# PostgreSQLを導入する
```:command
heroku addons:create heroku-postgresql:hobby-dev
```
```:command
Creating heroku-postgresql:hobby-dev on ⬢ sholovelaravel... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
```

一応うまくいってる？

●参考文献
[【Heroku Postgresql】アドオンを追加し、テーブル操作を行う](https://www.shookuro.com/entry/2018/03/11/160201)
どうもここではHeroku Postgresアドオンが自分のHerokuページに載るらしい。

<img width="1440" alt="スクリーンショット 2018-10-11 7.17.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/737b925e-e5d0-66ca-eb6b-e58d4943f320.png">

アドオンがあるからOKみたい！次は設定。

●参考文献
[Laravel + Heroku + HerokuPostgres でDB設定をサクッと環境変数に突っ込む](https://qiita.com/kamukiriri/items/1c5e17872c2fcefa1678)
これをみるとDBの設定も一瞬でできるらしい。

```:command
php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'
```

```:実行結果
Setting DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD and restarting sholovelaravel... done, v7
```

おっできた。何か適当にアプリを作ってマイグレーションしてみよう。

# マイグレーションの作成

```:command
php artisan make:migration create_boards_table
```

まずローカルでマイグレーションファイルを作成して、

```:マイグレーションファイル
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBoardsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('person_id');
            $table->string('title');
            $table->string('message');
            $table->timestamps();
        });
    }

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

herokuへデプロイする。ちなみにgithubに連携するとgithubへpushすると同時にherokuにもpushするのでとても便利。

```:command
heroku run 'php artisan migrate'
```

```:実行結果
Running php artisan migrate on ⬢ sholovelaravel... up, run.6720 (Free)
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > y

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_10_10_223310_create_boards_table
Migrated:  2018_10_10_223310_create_boards_table
```

テーブルできたー！！

# モデルの作成

```:command
php artisan make:model Board
```

コマンドプロンプトかターミナルで実行してBoardモデルを作成する。（Board.phpの名前で作成される）

モデル内は下記の内容に書き換える。

```:Board.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Board extends Model
{
    protected $guarded = array('id');

    public static $rules = array(
        'person_id' => 'required',
        'title' => 'required',
        'message' => 'required'
    );

    public function getData()
    {
        return $this->id . ': ' . $this->title;
    }
}
```
# BoardControllerの作成

```:command
php artisan make:controller BoardController
```

コマンドプロンプトかターミナルで実行してBoardコントローラーを作成する。（BoardController.phpの名前で作成される）

コントローラー内は下記の内容に書き換える。

```:BoardController
<?php

namespace App\Http\Controllers;

use App\Board;
use Illuminate\Http\Request;

class BoardController extends Controller
{
    public function index(Request $request)
    {
        $item = Board::all();
        return view('board.index', ['items' => $items]);
    }

    public function add(Request $request)
    {
        return view('board.add');
    }

    public function create(Request $request)
    {
        $this->validate($request, Board::$rules);
        $board = new Board;
        $form = $request->all();
        unset($form['_token']);
        $board->fill($form)->save();
        return redirect('/board');
    }
}
```

# テンプレートの作成

./resources/views/board内に「index.blade.php」を作成する。（boardディレクトリは各自作成する。）

```:index.blade.php
@extends('layouts.helloapp')

@section('title', 'Board.index')

@section('menubar')
    @parent
    ボード・ページ
@endsection

@section('content')
    <table>
        <tr><th>Data</th></tr>
        @foreach ($items as $item)
            <tr>
                <td>{{$item->getData()}}</td>
            </tr>
        @endforeach
    </table>
@endsection

@section('footer')
copyright 2017 shochang
@endsection
```

# ルート情報の記述

routesディレクトリ直下のweb.phpを更新する。
Route::get('board', 'BoardController@index');を追加する。

```:web.php
<?php

Route::get('board', 'BoardController@index');

Route::get('/', function () {
    return view('welcome');
});
```
これで「heroku open」でboardに接続すると。。。

<img width="1440" alt="スクリーンショット 2018-10-12 7.18.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/57702880-5b8a-bf92-eb0c-81bd9d3e35b6.png">

あれ出ない。。。

とっとりあえず長くなってきたので今日はここまで。次回はこの続きから