Laravel モデルの作成とデータ取得

Laravelではデータベースの各テーブルに対応する Model(モデル) と呼ばれるものが存在します(Eloquent Modelと呼ばれることもあります)。

モデルを使うことによってデータを追加したり、削除したり、検索したりできます。この記事ではモデルの作成方法、データベースからデータを取得する方法をまとめます。

前提

Laravelのアプリケーションとデータベースの接続が必要になります。以下の記事を参考にして、データベースの接続はしておきましょう。

データベースへの接続方法 (エラー対策付き)

モデルの作成

モデルはデータベースのテーブル1つ1つと対応しています。テーブル名はusers、productsなどのように複数形を使います。

参考:【初心者、必見】こんなのあるんだ!データベースの命名規約

Laravelのモデルの名前は以下のような規則になっているので、作成するときは注意が必要です。

  • 対応しているテーブル名の単数形
  • 最初の文字は大文字
  • 複数単語の場合は大文字で繋げる(UserHistoryなど)

モデルを作成するときは artisan コマンドを利用します。例えばProductsテーブルに対応している Product モデルを作成するときは以下のようなコマンドをターミナルで実行します。

$ php artisan make:model Product

コマンドを実行したら app ディレクトリ配下に Product.php というファイルが作成されていればOKです👍ファイルの中身は以下のようになっているはずです。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}

テーブル名、主キーを指定する

モデルはデータベースのテーブル1つ1つと対応しています。そして自動的にモデル名からどのテーブルと対応しているのかを想定してくれます。

  • モデル名 → テーブル名
  • User → users
  • Product → products
  • UserHistory → user_histories

もし仮にモデル名とは別のテーブルを利用したい場合は以下のようにモデルに記述することで対応テーブルを変更することができます。

例えば、order_products テーブルと対応させたい場合

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = 'order_products';
}

またモデルはテーブルの主キーカラムがどれかも自動で想定してくれます。基本的には id カラムを主キーだと認識してくれます。

もし仮に id カラムとは別のカラムを主キーとして利用したい場合は以下のようにモデルに記述することで主キーカラムを変更することができます。

例えば、product_id カラムを主キーカラムとしたい場合

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $primaryKey = 'product_id';
}

モデルを使ったデータ取得

作成したモデルを使ってデータベースからデータを取得する方法をまとめていきます。今回はControllerの中で利用することを想定して、以下のような ProductsControllertestアクション を作成しました。実際にはController以外にもどのファイルの中でも利用することが可能です。

Productモデル を利用するためにファイル上部で use App\Product; と書かれていることを確認してください。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;

class ProductsController extends Controller
{
    public function test()
    {
        //
    }
}

全件取得

all() というメソッドを利用してデータベースのすべてのデータを取得します。変数 $products に代入するのは以下のようにやります。

public function test()
{
    $products = Product::all();
}

条件付きで取得

where() というメソッドを利用して条件付きでデータを取得します。name カラムが Tシャツ となっているデータを取得し、変数 $products に代入するのは以下のようにやります。

public function test()
{
    $products = Product::where('name', 'Tシャツ')->get();
}

特定のカラムに数値が含まれている時に「以上、以下」という条件でデータ取得するときは以下のようにやります。

public function test()
{
    $products = Product::where('price', '>=', 100)->get();
}

他にも条件をつける方法はたくさんあるのでLaravel公式ドキュメントを参考にしてください。

参考:Where

最初のデータだけ取得

first() というメソッドを利用してデータベースの id が一番小さいデータを取得します。変数 $product に代入するのは以下のようにやります。

public function test()
{
    $product = Product::first();
}

firstWhere() というメソッドを利用すると、特定の条件付きで id が一番小さいデータを取得できます。

public function test()
{
    $product = Product::firstWhere('name', 'Tシャツ');
}

ただし、データベースにデータが存在しない、つまりid が一番小さいデータが存在しない場合にカスタマイズされた404エラー画面を発生させたい場合があると思います。

参考:Laravelのエラー画面をカスタマイズする

firstOrFail() というメソッドを利用すると、id が一番小さいデータが存在しない場合に404エラーを発生させます。

public function test()
{
    $product = Product::firstOrFail();
}

id指定で取得

find() というメソッドを利用して id が引数の数値と一致するデータを取得します。id = 1 のデータを取得し、変数 $product に代入するのは以下のようにやります。

public function test()
{
    $product = Product::find(1);
}

複数の id を一致させたい場合は引数に配列を入れてあげることでデータ取得が可能です。以下の例では id = 1, 2, 3 の3つのデータを取得しています。

public function test()
{
    $product = Product::find([1, 2, 3]);
}

ただし、データベースにデータが存在しない、つまり指定した idのデータが存在しない場合にカスタマイズされた404エラー画面を発生させたい場合があると思います。

参考:Laravelのエラー画面をカスタマイズする

findOrFail() というメソッドを利用すると、引数に指定したidのデータが存在しない場合に404エラーを発生させます。

public function test()
{
    $product = Product::findOrFail(1);
}

順番を並び替えて取得

orderBy() というメソッドを利用して引数にカラム名を指定すると順番の並び替え(ソート)をしてくれます。また第二引数に asc または desc を指定することで昇順、降順を指定できます。(デフォルトでは asc(昇順) 担っています。 )変数 $products に代入するのは以下のようにやります。

public function test()
{
    $product = Product::orderBy('price', 'desc')->get();
}

取得する数に制限をかける

take() というメソッドを利用して引数に数値を入れることで、取得するデータ数を制限することができます。5つのデータを取得し、変数 $products に代入するのは以下のようにやります。

public function test()
{
    $product = Product::take(5)->get();
}

また limit() というメソッドでも同じ結果が得られます。

public function test()
{
    $product = Product::limit(5)->get();
}

まとめ

この記事では以下のことを書きました。

  • モデルの作成方法
  • モデルの定義方法
  • モデルを使ったデータ取得方法

他にもさまざまな条件をつけた取得の仕方があるので「Laravel モデル 取得」などで調べてみてください。