日本語諸方言コーパスをDB化して遊ぶ (3) PHP Laravel で操作する

データベースに慣れるために、「日本語諸方言コーパス (COJADS) 」の元データをデータベース化してみました。第３回は前回作成した SQLite3 データベースを PHP Laravel で操作するところまで。完全に自分用の作業メモで、説明もいろいろ足りていないと思いますが、ご容赦ください。

注：この記事で作ったものは第４回以降では使わないので、飛ばしてもいいかもしれません。

- 第１回： [日本語諸方言コーパスをDB化して遊ぶ (1) 構成を考える](https://qiita.com/a_eau_/items/dcb83886c4b580565ce7)
- 第２回： [日本語諸方言コーパスをDB化して遊ぶ (2) SQLite3 で DB 化](https://qiita.com/a_eau_/items/0bb4f3f8271c6dbc12a5)
- 第３回： 日本語諸方言コーパスをDB化して遊ぶ (3) PHP Laravel で操作する　←今ここ
- 第４回： [日本語諸方言コーパスをDB化して遊ぶ (4) サービスの全体像を決める](https://qiita.com/a_eau_/items/0af125f960dd1d16fcde)
- 第５回： [日本語諸方言コーパスをDB化して遊ぶ (5) データベースの移行とモデルの作成](https://qiita.com/a_eau_/items/3cad488add22bfacfeaa)
- 第６回： [日本語諸方言コーパスをDB化して遊ぶ (6) 談話ごとの発話総覧を作る](https://qiita.com/a_eau_/items/2a7072e3cab4729623cb)
- 第７回： [日本語諸方言コーパスをDB化して遊ぶ (7) 話者ごとの発話総覧を作る](https://qiita.com/a_eau_/items/ccb472a0fc2ac6ca9919)
- 第８回： [日本語諸方言コーパスをDB化して遊ぶ (8) ファイル形式変換機能をつける](https://qiita.com/a_eau_/items/3f196631348fec1cfc8d)
- 第９回： [日本語諸方言コーパスをDB化して遊ぶ (9) Heroku でデプロイする](https://qiita.com/a_eau_/items/1ae966836d0cf4a6ba0e)

## Laravel の設定
Laravel は PHP のフレームワークのひとつです。そんな凝ったものは作らないので素の PHP でもいいんですが、Laravel の案件も多いし、せっかくなので Laravel を使ってみます（使ったことないけど、Ruby on Rails みたいなもんだろうという軽い気持ち）。

### PHP と Laravel の導入
Laravel は PHP のフレームワークなので、まず PHP 環境を作って、依存関係管理の Composer を利用して Laravel を導入していきます。PHP 環境は XAMPP にしました。Windows 環境なのでインストーラーでさくっとインストールします（今回は PHP 7.4.8、Laravel 7.21.0 を使用しています）。

- [Laravelをインストールしよう！導入手順まとめ（Mac, Windows） | Samurai Blog](https://www.sejuku.net/blog/106106)

### SQLite の有効化

SQLite をデータベースとして使えるように PHP の設定を変更します。私の環境では XAMPP でインストールした時点で有効化されていましたが、念のため php.exe と同じフォルダの設定ファイル php.ini を確認して、以下の行が `;` でコメントアウトされていないことを確認しておきます。

```ini:php.ini
extension=pdo_sqlite
```


### プロジェクトの作成
Composer で適当な場所に Laravel プロジェクトを作成します。今回は XAMPP フォルダに `_projects` フォルダを作成し、その中で `cojads` プロジェクトを管理することにします。

```cmd:cmd
C:\xampp\_projects>composer create-project laravel/laravel --prefer-dist cojads
```

cojads プロジェクトの設定から、データベースとして SQLite を使用するように変更しておきます。`DB_CONNECTION` を `sqlite` にして、それ以降のデータベースの設定項目は不要なので、削除するかコメントアウトします。

```env:.env内
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

↓↓↓次のように変更する↓↓↓

DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=homestead
#DB_USERNAME=homestead
#DB_PASSWORD=secret
```

`/config/database.php` のデフォルト設定も、mysql になっているので sqlite に変更しておきます。

```cmd:config/database.php内
'default' => env('DB_CONNECTION', 'mysql'),

↓↓↓次のように変更する↓↓↓

'default' => env('DB_CONNECTION', 'sqlite'),
```

- [PHP SQLiteドライバーのインストール方法 | Awesome Blog](https://awesome-linus.com/2019/05/24/php-sqlite-driver-install/#toc6)
- [Laravelでsqliteをデータベースとして使用する方法 | Awesome Blog](https://awesome-linus.com/2019/05/24/laravel-sqlite-database/)


## データベースの設定
### 既存データベースのマイグレーション
まずはマイグレーションを行ないます。前回作成した `cojads.sqlite3` を**`database.sqlite` に改名して** [^migration]プロジェクトの `database` フォルダに配置します。マイグレーションは `php artisan migrate` コマンドで行なえます。

[^migration]: これは Laravel がデフォルトで `database` フォルダの `database.sqlite` を参照する設定になっているからです。ファイル名を変えたくない場合は、`config/database.php` の内で `database.sqlite` を参照している部分を任意のファイル名に変更するか、ルートの `.env` 内でデータベースの場所をフルパスで指定する必要があります。たとえば `DB_DATABASE=C:\xampp\_projects\cojads\database\cojads.sqlite3` など。

```cmd:cmd
C:\xampp\_projects\cojads>php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.32 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.13 seconds)
```


### モデルの作成
次に Model を設定します。初期段階では Model 用のフォルダもないので、ひとまず `app` フォルダに `Models` フォルダを新規作成し、以下のようにテーブルごとにモデルを作成していきます。

```cmd:cmd
php artisan make:model Models/prefecture
php artisan make:model Models/location
php artisan make:model Models/speaker
php artisan make:model Models/discourse
php artisan make:model Models/utterance
```

そうすると、`Models` フォルダ内にそれぞれのモデルのクラス設定ファイルが作成されています。作成した段階ではクラス宣言のみで何の役にも立たないので、たとえば `speaker` テーブルなら以下のように属性とゲッターメソッドを書き込んでいきます。`$guarded` には主キー `speakerId` を設定します。

```php:app/Models/speaker.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Speaker extends Model{
    protected $table = 'speaker';
    protected $guarded = array('speakerId');
    public $timestamps = false;

    public function getData(){
        $data = DB::table($this->table)->get();
        return $data;
    }
}
```

- [Laravel入門[MVC]モデルを使ってデータベースからデータ取得・表示を行う | RitoLabo](https://www.ritolab.com/entry/49#aj_3)


## ルーティングとサンプルページの作成
今回はデータベースの中身を閲覧できるシンプルなページを作ります。今回は「話者 (speaker) 」を閲覧できるページを作りましょう。まず `routes/web.php` にルーティングを追加します。以下では `cojads/speaker` に GET アクセスすると `CojadsController` コントローラーの `speaker` アクションを実行するようにしています。

```php:web.php
Route::get('cojads/speaker', 'CojadsController@speaker');
```

次にルーティングに沿って `CojadsController` コントローラーを新規作成して……

```cmd:cmd
php artisan make:controller CojadsController
```

さっき指定した `Speaker` モデルに関する `speaker` アクションだけ作ります。ここではデータを取得して `cojads.speaker` ビュー、つまり `views/cojads` フォルダの中の `speaker` という名前のファイルに値を送るようにしています。

```php:app/Http/Controllers/CojadsController.php
<?php
namespace App\Http\Controllers;
use App\Models\Speaker;

class CojadsController extends Controller{
  public function speaker(){
    $md = new Speaker();
    $data = $md->getData();
    return view('cojads.speaker', ['data' => $data]);
  }
}
```

最後に今のアクションの指定に沿って `/resources/views` フォルダに `cojads` フォルダを作り、その中にビューを作成していきます。ここでは blade 記法を使うので `speaker.blade.php` を作成して、以下のようにテーブルを作って `speaker` テーブルの内容を順に描画していきます。

```php:/resouces/views/cojads/speaker.blade.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Show Speakers</title>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>話者ID</th>
          <th>性別</th>
          <th>生年</th>
        </tr>
      </thead>
      <tbody>
        @foreach($data as $d)
        <tr>
          <td>{{$d->speakerId}}</td>
          <td>{{$d->speakerSex}}</td>
          <td>{{$d->speakerBirthyear}}</td>
        </tr>
        @endforeach
      </tbody>
    </table>
  </body>
</html>
```

ここまでの作業が済んだら、正しく表示されるか確認します。`php artisan serve` を実行してローカルサーバを立ち上げて……

```cmd
C:\xampp\_projects\cojads>php artisan serve
Laravel development server started: http://127.0.0.1:8000
```

先ほどルーティングした通り `http://127.0.0.1:8000/cojads/speaker` にアクセスします。

![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526487/955ae0c1-6150-2680-1626-4e80ba922a44.png)

きちんと表示されていますね（ CSS は適当にあてています）。

### 次回予告
~~次回は検索機能など、もうちょっとリッチな機能を実装します。~~
実装したい機能を詰めて、アプリの全体像を作成していきます。

- 第４回： [日本語諸方言コーパスをDB化して遊ぶ (4) サービスの全体像を決める](https://qiita.com/a_eau_/items/0af125f960dd1d16fcde)