7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#環境
PHP 7.3.24
Laravel 6.20.30
MAMP

Model(モデル)とは?

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

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

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

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

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

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

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

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

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

<?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

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

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

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

$ php artisan make:model Models/Product

今回はモデルは特に編集しないでいきます。
モデルの命名規則に従っているため、テーブルを改めて指定する必要もないですからね!

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}

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

$ php artisan make:controller ProductController

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

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にアクセスした際にProductControllerindexメソッドを呼ぶように設定しました。

web.php
Route::get('/product', 'ProductController@index');

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

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

###7. ブラウザで画面表示を確認する
画面表示は以下のようになり、在庫ありの商品だけを表示させることができました!
スクリーンショット 2021-07-19 21.15.48.png

#参考
LaravelのModelを初心者向けに解説!作成方法や使い方、実践までを即理解

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?