ORMとは?
PHPとデータベースのレコードは基本的な仕組みが異なるので、
データベースのレコードをPHPの変数に入れるとなると、
「とりあえず、レコードは全部連想配列にまとめてしまえ」となるのはやむを得ない。
そこで、PHPのオブジェクトとデータベースの間の、
橋渡しをしてくれる仕組みが 「ORM」 と呼ばれる機能です。
「ORM」 = Object Relational Mapping
Eloquentとモデル
Laravelには「Eloquent(エロクアント)」というORMが用意されています。
「モデル」のクラスを定義し、これを利用してデータベース操作を行えるように
設計されています。
モデルは、「テーブルの内容を定義したクラス」です。
モデルを作成する
モデル作成するphp arisanコマンドを使用する。
% php artisan make:model Person
<注意事項>
*Laravelでは、「テーブル名は複数形、モデルは単数形」という命名規則がある。
PersonController.phpを作成する
コントローラを作成するphp artisanコマンドを使用する。
% php artisan make:controller PersonController
ルート情報に記述する
Route::get('person','App\Http\Controllers\PersonController@index');
Personモデルで全レコードを得る
$items = Person::all();
上記の記述で、全レコードを取得することができます。
取得されたレコードは、「Illuminate\Database\Eloquent」名前空間の
Collectionクラスのインスタンスとして得られます。
Personクラスにメソッドを追加する
DBクラスと決定的に違うのは、
「コレクションにまとめられているのは、配列ではなく、モデルクラスのインスタンスである」という点です。
1つ1つのレコードは全てPersonクラスのインスタンスとしてまとめられています。
Personクラスの拡張
@extends('layouts.helloapp')
@section('title','Person.index')
@section('menubar')
@parent
インデックスページ
@endsection
@section('content')
<table>
<tr><th>Name</th></tr>
@foreach($items as $item)
<tr>
<td>{{$item->getData()}}</td>
</tr>
@endforeach
</table>
@endsection
@section('footer')
copyright 2020 tuyano.
@endsection
IDによる検索
$変数 = モデルクラス :: find( 変数 );
findは、そのようにモデルクラスの静的メソッドとして呼び出します。
引数には検索するID番号を指定します。
<注意点>
Eloquentでは、
「デーブルのプライマリキーはidという整数値のフィールドである」という前提でfindは実行します。
検索用のテンプレートページを作る
@extends('layouts.helloapp')
@section('title','Person.find')
@section('menubar')
@parent
検索ページ
@endsection
@section('content')
<form action="/person/find" method="post">
@csrf
<input type="text" name="input" value="{{$input}}">
<input type="submit" value="find">
</form>
@if (isset($item))
<table>
<tr><th>Data</th></tr>
<tr>
<td>{{$item->getData()}}</td>
</tr>
</table>
@endif
@endsection
@section('footer')
copyright 2020 tuyano.
@endsection
PersonController.phpの修正
class PersonController extends Controller
{
public function index(Request $request)
{
$items = Person::all();
return view('person.index', ['items' => $items]);
}
public function find(Request $request)
{
return view('person.find', ['input' => '']);
}
public function search(Request $request)
{
$item = Person::find($request->input);
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
}
ルート情報の追加
Route::get('person/find','App\Http\Controllers\PersonController@find');
Route::post('person/find','App\Http\Controllers\PersonController@search');
findは、/findにGETアクセスした時の処理、
searchは、POST送信された時の処理です。
$item = Person::find($request->input);
上記の記述で、$itemには、検索されたPersonインスタンスが代入されます。