Laravel基礎（４）データベースを使う

#接続設定
Laravelでデータベースを使うために接続情報をLaravelプロジェクトディレクトリの直下にある`.env`ファイルに適切に書きます。
今回は、MySQLを使いますので、事前のMySQLを起動しておく必要があります。

```(~/.env) 
・・（一部抜粋）・・
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=?????
DB_USERNAME=?????
DB_PASSWORD=?????

```
なお、これらの環境変数は`config/database.php` ファイルの　`env()`の箇所で使われます。ですので、`config/database.php`の方はデフォルトのままでいいです。

#モデルとマイグレーション

DBを扱うクラスをモデルクラスと言います。基本的にテーブル１つに対し１つのモデルクラスを作ります。
モデルクラスはコマンドで雛形を作成します。
今回は商品を扱うので、Itemという名前にしました。

```sh
php artisan make:model Item
```
すると次のようにphpファイルが出来上がります。

`app/Item.php`



マイグレーション（DBテーブルの用意）も行っておきます。

```sh
php artisan make:migration Item
```

出来上がった
`database/migrations/YYYY_MM_DD_HHMMSS_item.php`
のなかに必要なテーブル定義を書きます。

```database/migrations/YYYY_MM_DD_HHMMSS_item.php
class Item extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
        Schema::create('items', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('price');
            $table->string('url');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
        Schema::drop('items');
    }
}
``` 
up()はマイグレーション実行時に行うことを、down()はマイグレーション取り消し時に行うことを書きます。
ここではup()でテーブル作成、down()でテーブル削除をします。
作るテーブルの名称は商品を複数扱うので、itemsにしました。フィールドの定義はID（キー）と必要と思われる商品属性：名称（name）、価格（price）、URL（url）、タイムスタンプ　です。


マイグレーション実行します。

```sh

php artisan migrate
```


#初期データ投入

初期データを投入したい時はLaravelのSeeder（シーダ）という機能を使います。次のコマンドでシーダクラスを作ります。この例では`ItemTableSeeder`という名前を指定しています。

```sh
php artisan make:seeder ItemTableSeeder
```
`database/seeds`に指定のシーダクラスが作られます。入れたい初期データをハッシュの配列として作成しinsertするようにコードを書きます。

```database/seeds/ItemTableSeeder.php
class ItemTableSeeder extends Seeder
{
    public function run()
    {
        $datas = [
         ['name' => 'コカコーラ', 'price' => 110, 'url' => ''],
         ['name' => 'ポテトチップス', 'price' => 135, 'url' => ''],
         ['name' => 'チョコレート', 'price' => 120, 'url' => ''],
        ];
        DB::table('items')->insert($datas);
    }
}

```
次のように実行します。

```sh
php artisan db:seed --class=ItemTableSeeder
```
`--class`指定をなくすと全てのシーダクラスの実行となります。
また、マイグレーションから初期データを投入したいときは、次のコマンドでデータベースを完全に作成し直します。

```sh
php artisan migrate:refresh --seeddescription
```

#モデルクラスを使う

上で作ったモデルクラスItemを利用して、データベースにアクセスをしてみましょう。

ここでは商品を扱うモデルなので、その上位のItemコントローラーを事前に用意しそのアクションとしてgetListメソッドを持っておきます。getListからこのモデルのitemsテーブルに対する取得メソッドを呼ぶのです。
使用するビューテンプレートも次のものを参考にしてください。

ItemControllerコントローラーを作ります。

```sh

php artisan make:controller ItemController 
```
コントローラーにメソッドを用意します。
 
```app/Http/Controllers/ItemController.php
 
<?php

namespace App\Http\Controllers;

use App\Item;//モデルの指定
//use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class ItemController extends Controller
{
    //
    public function getList(Request $request)
    {
        $data = Item::all();
//    条件で絞り込む時はクエリビルダで
//    $data = Item::where('id', '>', 10)->get();
//    これでも同じ
//    $data = DB::table('items')->where('id', '>', 10)->where('price',100)->get();

        return view('item.list', ['data' => $data]);
//   そのまま値をreturnするとJSONになります。
//   return $data;
    }
}
```

ビューへは$dataという変数で、`Item::all()`で取得したテーブル内容をそのまま渡しています。ちなみにテーブルへの挿入処理は次のようなコードになります。

```
    public function insert()
    {
        $item = new Item();
        $item->name = "テスト";
        $item->price = 100;
        $item->url = "";
        $item->save();
    } 
```

ルーティング情報はコントローラークラス@メソッドを定義します。 

```routes/web.php  
Route::get('/list','ItemController@getList');
``` 

View(Blade)の配置場所 

```sh

mkdir resources/views/item
```
ビューではコントローラーから受け取る結果を表示します。

```resources/views/item/list.blade.php 
 
<html>
<head>
    <title>とりあえずDBアクセス</title>
</head>
<body>
    <h1>とりあえずDBアクセス</h1>
    <table>
    <tr>
        <th>Id</th>
        <th>Name</th>
        <th>Price</th>
        <th>Url</th>
        <th>Created</th>
        <th>Updated</th>
    </tr>
    @foreach($data as $val)
    <tr>
        <td>{{$val->id}}</td>
        <td>{{$val->name}}</td>
        <td>{{$val->price}}</td>
        <td>{{$val->url}}</td>
        <td>{{$val->created_at}}</td>
        <td>{{$val->updated_at}}</td>
    </tr>
    @endforeach
    </table>
</body>
</html>
``` 
$dataがコントローラーから受け取る変数です。ここではテーブル内容のモデルのオブジェクトリストをもらいますので、foreachで反復して表示しています。

Bladeではディレクティブと呼ばれる@で始まる命令を使って、HTMLタグとの分離を図っています。
`@if / @unless / @empty / @isset / @foreach / @while / @break / @continue / @php / @section / @yield` など の記述で、テンプレートにコードを埋め込むことができます。


実はモデルクラスの`app/Item.php` はコマンドで雛形を作ってから何もコードを書いていません。
それでも基本のデータ挿入、検索、更新、削除はできるのです。