PHPのlaravelでMySQLのデータベースにアクセスしてみた

[前回](https://qiita.com/keb/items/4e197fb772298d2119f3)の続き

### 環境

- Mac High Sierra 10.13.5
- PHP 7.1.16
- composer 1.5.6
- laravel 5.6.33

### 設定変更

- パーミション変更    
参考によれば、パーミッションを変更したほうが良さそうなので、変更

```bash
$ chmod 777 bootstrap/cache
$ chmod 777 storage
```

### コントローラーとビュー作成

- コントローラー作成    
以下コマンドでリソースコントローラを作成

```bash
$ php artisan make:controller WorldController --resource
Controller created successfully.
```

[プロジェクトルート]/app/Http/ControllersにWorldController.phpが作成されている

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class WorldController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
```

一部修正。これでviewに飛ばす。

```php
    public function index()
    {
        return view('world');
    }
```

なお、artisan は Laravel に含まれているユーティリティーコマンドみたいです。
コマンド一覧は以下で確認可能

```bash
$ php artisan list
```

- コントローラーへのルートを登録    
[プロジェクトルート]/routes/web.phpの最終行に追加  
/worldときたらコントローラーへ飛ばす

```php
<?php

Route::get('/', function () {
    return view('welcome');
});

Route::resource('world', 'WorldController');
```

- View作成    
[プロジェクトルート]/resources/views/world.blade.php作成

```php
<!doctype html>
<html>
  <body>
    <h1> Hello World </h1>
  </body>
</html>
```

- 起動

```php
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

これで、http://127.0.0.1:8000/world にアクセスしてHello Worldと表示されればOK。

### データベース作成

- データベースの作成    
データベースはMySQLを使用する  
MySQLのバージョン確認

```bash
$ mysql -V
mysql  Ver 8.0.12 for osx10.13 on x86_64 (Homebrew)
```

- [MySQLのサイト](https://dev.mysql.com/doc/index-other.html)からサンプルーデータ(world database)をダウンロードして登録
- worldユーザを作成する

```bash
$ mysql.server start
Starting MySQL
 SUCCESS!
```
```bash
$ mysql -u root -p < world.sql
```
```bash
$ mysql -u root -p

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+
5 rows in set (0.00 sec)

mysql> create user world identified with mysql_native_password by 'パスワード';
mysql> grant all privileges on world to world@'%';
mysql> grant all privileges on `world`.city to 'world'@'%';
```

- my.cnf修正  
default-authentication-pluginを追加

```my.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
```

※worldユーザ作成し、データにアクセスしようとしたら、以下のエラーが発生し、
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

[ここ](https://qiita.com/hondy12345/items/60a91488648f5ff45ff9)や[ここ](https://yoku0825.blogspot.com/2018/01/mysql-804.html)や[ここ](https://www.s-style.co.jp/blog/2018/05/1807/)を参考に色々やった結果、ユーザの作成コマンドや、my.cnfをいじって対応。

- .envを修正  
DB_DATABASE, DB_USERNAME, DB_PASSWORDを修正する

```bash
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=world
DB_USERNAME=world
DB_PASSWORD=パスワード
```

- WorldController修正  
use Illuminate\Support\Facades\DB; 追加  
index()を修正

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

    public function index()
    {
        $city = DB::select('select * from city');
        return view('world', ['city' => $city]);
        // return view('world');
    }
```

- View修正  
cityテーブルのデータを表示する

```php
<!doctype html>
<html>
  <body>
    <h1> Hello World </h1>
    <table border=1>
    <tr>
      <td>ID</td>
      <td>Name</td>
      <td>CountryCode</td>
      <td>District</td>
      <td>Population</td>
    </tr>
    <?php foreach($city as $row){ ?>
    <tr>
        <?php foreach($row as $cel){ ?>
            <td><?= $cel?></td>
        <?php } ?>
    </tr>
    <?php } ?>
    </table>
  </body>
</html>
```

MySQLに登録したデータが表示されればOK。