Laravelのモデルについて理解する

#環境
PHP 7.3.24
Laravel 6.20.30
MAMP

# Model(モデル)とは？
Laravelで使うモデルは主にDBとの連携を行う機能を持っています。
DBのデータの追加や登録、データの取得や並び替えなどDBの全般的な操作が可能です。

基本的には１つのテーブルにつき１つのモデルが存在します。
テーブルとモデルが対応することで、モデルからDBの操作が可能になるということになります。

#モデルの作成
例えばColorという名前のモデルを作成する場合は、以下のコマンドを実行することでモデルの作成ができます。
`php artisan make:model Color`

指定のディレクトリの中にモデルを作成する場合は、以下のコマンドを実行します。
今回はModelsという名前のディレクトリ内にColorという名前のモデルを作成しました。
`php artisan make:model Models/Color`

<font color="red">モデル名の頭文字は大文字(アッパースネークケース)にすること！</font>
※モデルを削除したい場合は、作成したモデルのファイルを手動で削除すればOKです

#モデルの命名規則
上述の通り、基本的には１つのテーブルにつき１つのモデルが存在するので
モデルの名前とテーブルの名前は関連性のある名前にしておく必要があります。

colorsテーブルだとColorモデル
productsテーブルだとProductモデル
このようにテーブル名は複数形、モデル名はテーブル名の単数形とするのが一般的です。
こうすることでLaravelが自動でモデルとテーブルを紐づけてくれます。

作成するモデルを指定のテーブルと紐づけたい場合は`$table`をオーバライドします。
今回はColorという名前のモデルに、personal_colorsテーブルを対応させていきます。

まず`php artisan make:model Models/Color`でModelsディレクトリ内にColorsモデルを作成した後、作成されたファイルに以下を追記すると、指定のテーブルとモデルを紐づけることができます。

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Color extends Model
{
   protected $table = 'personal_colors';
}

```
#実際にモデルを使ってみよう

###1. migrationファイルの作成（テーブル作成）
今回はproductsという名前のテーブルを作成していこうと思います。
まず以下のコマンドを実行してマイグレーションファイルを作成していきます。

```
$ php artisan make:migration create_products_table
```

マイグレーションファイルの中身は以下の通りです。

```php:2021_07_18_223308_create_products_table.php
<?php

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('product_name');
            $table->integer('price');
            $table->boolean('stock');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}
```
マイグレーションを実行してDBの方に反映させていきます。

```
$ php artisan migrate
```

DBをみると以下のテーブルができました！（コメントの箇所は後で追記しました）
![スクリーンショット 2021-07-18 22.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916260/67afc807-72e3-54e5-bc9c-90ccaf16f03a.png)


###2. モデルの作成
以下のコマンドを実行して、モデルを作成します。

```
$ php artisan make:model Models/Product
```
今回はモデルは特に編集しないでいきます。
モデルの命名規則に従っているため、テーブルを改めて指定する必要もないですからね！

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}
```

###3. コントローラーの作成
以下のコマンドを実行して、コントローラを作成します。

```
$ php artisan make:controller ProductController
```


###4. コントローラでモデルを呼び出す
先ほど作成したコントローラのファイル内でモデルに対して指示を出していきます。

```php:ProductController.php
<?php

namespace App\Http\Controllers;

// Productモデルを呼び出す
use App\Models\Product;

class ProductController extends Controller
{
    public function index() {
      // モデルクラスをインスタンス化してproductsテーブルのデータをビュー側で使えるようにする
      $products = Product::all();
      
      // index.blade.phpに$productsをわたす
      return view('index', ['products' => $products]);
    }
}
```

###5. ルーティング
`routes/web.php`でルート処理を記述します。
`/product　`URLにアクセスした際に`ProductController`の`index`メソッドを呼ぶように設定しました。

```php:web.php
Route::get('/product', 'ProductController@index');
```
###6. ビューで表示する
`ProductController`で`index.blade.php`を返すようにしているので、`index.blade.php`を記述していけばブラウザ上に表示されるようになります。
今回は在庫ありの商品(stock = 1)のみを表示するようにしていきます。

```html:index.blade.php
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>モデルのテスト</title>
</head>

<body>
    <table>
        <tr>
            <th>商品名</th>
            <th>価格</th>
        </tr>
        <!-- コントローラで定義したモデルをインスタンス化したプロパティをforeachで回していきます -->
        @foreach ($products as $product)

            <!-- 在庫ありの商品の商品名と価格を表示 -->
            @if ($product->stock === 1)
                <tr>
                    <td>{{ $product->product_name }}</td>
                    <td>{{ $product->price }}</td>
                </tr>
            @endif

        @endforeach
    </table>
</body>

</html>
<style>
    table {
        border: 1px solid #000;
    }
</style>
```
DBのデータの中身
![スクリーンショット 2021-07-19 21.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916260/94fdcf18-0e71-30f6-3288-d93390bc0cec.png)

###7. ブラウザで画面表示を確認する
画面表示は以下のようになり、在庫ありの商品だけを表示させることができました！
![スクリーンショット 2021-07-19 21.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916260/4e44fb64-0530-1825-f6cd-c50761b7cba5.png)



#参考
[LaravelのModelを初心者向けに解説！作成方法や使い方、実践までを即理解](https://udemy.benesse.co.jp/development/system/laravel-model.html)