#環境
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
マイグレーションファイルの中身は以下の通りです。
<?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をみると以下のテーブルができました!(コメントの箇所は後で追記しました)
###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. コントローラでモデルを呼び出す
先ほど作成したコントローラのファイル内でモデルに対して指示を出していきます。
<?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
メソッドを呼ぶように設定しました。
Route::get('/product', 'ProductController@index');
###6. ビューで表示する
ProductController
でindex.blade.php
を返すようにしているので、index.blade.php
を記述していけばブラウザ上に表示されるようになります。
今回は在庫ありの商品(stock = 1)のみを表示するようにしていきます。
<!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>