Eloquentの基本

ORMとは、データベースのレコードをプログラミング言語のオブジェクトとして扱えるようにするための仕組み。

Laravelには「Eloquent」というORMがある。

 

ORM

 ORMを使うことで、データベースのレコードをPHPのクラス(インスタンス)に変換し、処理ができる。

f:id:mkyosuke:20200109112636p:plain

 

ORMは異なる構造を変換して繋げる

 ORMは、「Object-Relational Mapping」の略。互換性のないデータを自動的に変換して、相互にデータをやり取りできるようにするための仕組み。

ORMにより、データベースから取り出されたレコードはPHPのオブジェクトの形に変換して渡されるようになる。

反対にPHPからデータベースに渡すときは、PHPオブジェクトがレコードに変換して渡される。

相互にデータ構造を変換を変換することで、クラスとデータベースのやり取りが行える。

 

Eloquentとモデル

 Laravelには、「Eloquent」(エロクアント)というORMがある。

「モデル」クラスを定義し、これを利用してデータベース操作ができる。

モデルは、テーブルの内容を定義したクラス。そのテーブル内にあるフィールドをプロパティとして持ち、テーブルとフィールドをモデルクラスとインスタンスを扱う感覚で操作ができる。

 

モデルを作成する

 Eloquentを利用。

テーブルを操作するモデル「abc」を作成。

モデルの作成は、コマンドを使う。カレントディレクトリをプロジェクトフォルダ内に設定し以下のコマンドを実行。

php artisan make:model abc

これでモデルが作成。

php artisan make:model モデル名

 プロジェクトフォルダ内の「app」フォルダの中に、「abc.php」ファイルが作成。

モデルクラスは、「app」フォルダ内に配置がされるのが基本。

f:id:mkyosuke:20200110123024p:plain

モデルクラスのソースコード

 abc.phpを見てみる。デフォルトでは以下のような感じ。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class abc extends Model
{
    //
}
 

モデルクラスは、Illuminate\Database\Eloquent名前空間にある「Model」を継承したクラスとして作成。

abcクラスは、「test」テーブルを利用するためのクラスとして用意。

 

abcControllerを作成する

 abcモデルを利用するコントローラを作成。

コントローラは、artisan make:controllerコマンドで作成。コマンドで作成。

php artisan make:model abc

abcController.phpが作成。作成されたスクリプトファイルを開き、ソースコードを記述。

<?php

namespace App\Http\Controllers;

use App\abc;
use Illuminate\Http\Request;

class abcController extends Controller
{
    public function index(Request $request)
    {
       $items = abc::all();
       return view('abc.index',['items' => $items]);
    }
}

今回は、indexアクションを用意。

 

index.blade.phpを作成する

 続いて、indexアクション用のテンプレートを作成。「views」内に、「abc」という名前でフォルダを作成。その中に「Index.blade.php」ファイルを作り、以下に記述。

 

ここでは、$itemsとして受け取ったレコードデータを出力。

 

ルート情報を追加

 Web.phpを開き、以下の文に追記。

Route::get('abc','abcController@index');

記述したら、/abcにアクセス。

@extends('layouts.sample')

@section('title', 'abc.index')

@section('menubar')
   @parent
   サンプル
@endsection

@section('content')
   <table>
   <tr><th>Name</th><th>Mail</th><th>Age</th></tr>
   @foreach ($items as $item)
     <tr>
        <td>{{$item->name}}</td>
        <td>{{$item->mail}}</td>
        <td>{{$item->age}}</td>
     </tr>
   @endforeach
   </table>
@endsection

@section('footer')
サンプル
@endsection

abcテーブルにあるレコードが表示。

f:id:mkyosuke:20200110131549p:plain





abcモデルで全レコードを得る

 今回作成したabcControllerのindexアクションで行っている処理を見る。

 $items = abc::all();

abcクラスの「all」メソッドで全レコードを取得

取得されたレコードは、Illuminate\Database\Eloquent名前空間Collectionクラスのインスタンスとして得られる。

レコード管理専用のコレクションクラス。foreachなどで値を取り出して処理することができる。

テンプレート側では、コレクションから繰り返しを使ってオブジェクトを取得し、そこからフィールドの値を取り出して表示。

 

abcクラスにメソッドを追加

モデルクラスにプロパティやメソッドを追加で拡張ができる。

■abcクラスに以下のメソッドを追加する。

class abc extends Model
{
    return $this->id.':'.$this->name.'('.$this->age.')';
}

 

IDの検索

 レコードIDを使って特定のレコードを取り出すことが可能。

「find」メソッドは、「IDによるレコード検索」。

$変数 = モデルクラス::find(整数);

findは、モデルクラスのメソッド。引数には、検索するID番号を指定。

findは、テーブルの「id」フィールドから指定の番号のものを検索。

 

 

/findアクションを作る

 /findアクションという検索用のページを作成してfindを使ってみる。

まず、テンプレートを用意。

「views」内の「person」フォルダ内に「find.blade.php」を作成。ソースコードを以下に作成。

@extends('layouts.sample')

@section('menubar')
   
@endsection

@section('content')
   <form action="/abc/find" method="post">
   @csrf
   <input type="text" name="input" value="{{$input}}">
   <input type="submit" value="検索">
   </form>
   @if(isset($item))
   <table>
   <tr><th>結果</th></tr>
   <tr>
     <td>{{$item->getData()}}</td>
   </tr>
   </table>
   @endif
@endsection

 

abcController

<?php

namespace App\Http\Controllers;

use App\abc;
use Illuminate\Http\Request;

class abcController extends Controller
{
    public function index(Request $request)
    {
       $items = abc::all();
       return view('abc.index',['items' => $item]);
    }
    
    public function find(Request $request)
    {
       return view('abc.find',['input' => '']);
    }
    
    public function search(Request $request)
    {
       $item = abc::find($request->input);
       $param = ['input' => $request->input'item' =>$item];
       return view('abc.find',$param);
    }
}

findは、GETアクセスしたときの処理

serachは、POST送信された時の処理

 $item = abc::find($request->input);

 ルート情報

Route::get('abc/find','abcController@find');
Route::post('abc/find','abcController@search');

 /person/fndにアクセス。

テキストフィールドから番号を入力して検索

f:id:mkyosuke:20200110155734p:plain