laravel5で顧客管理webアプリを作成したのでメモの続きです。
前提として、データベースの接続、マイグレーションの利用で説明した「.env」の利用データベースの設定が必要となります。
eloquentとは?
laravelで使用出来るORM(オブジェクト関係マッピング)です。通常phpでデータベースのテーブルを編集する場合は、sqlを用います。ですがそうすると、コード内にphpとsqlが混ざり可読性が損なわれてしまいます。そこで、ORMを使うとテーブルとの接続をまとめたクラスを作成し、そのメソッドを使うことでsqlを用いないレコード操作が可能となります。
eloquent使用の準備
モデルの作成
eloquentで使用するテーブルとの接続をまとめたものをモデルと言います。artisanで雛形を作成しましょう。
$ php artisan make:model モデル名
これでappの直下にモデル名.phpが作成されます。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class モデル名 extends Model
{
//
}
テーブルとの紐付け
作成したモデルと使用するテーブルを紐付ける設定をします。
まず行うのは、テーブルの設定です。作成したモデルのclass内に下記を追加しましょう。
protected $table = 'テーブル名';
通常はこれだけで指定したテーブルの操作が可能となります。
その他設定
前述の紐付けだけではエラーとなる場合もあります。その理由としてよくあるのは
1. 主キーのカラム名
2. タイムスタンプの有無
です。
主キーのカラム名
eloquentでは通常テーブルの主キーを「id」として想定しています。そのため主キーが「id」以外の場合はエラーが発生します。
その場合はクラス内に
protected $primaryKey = ‘主キー名’;
を追加するとエラーが回避されます。
タイムスタンプの有無
eloquentでは自動的にレコードの追加、編集をした際にタイムスタンプ「created_at」と「updated_at」カラムを更新します。
もし上記のカラムがない場合はエラーが発生してしまうので、タイムスタンプの更新を無効にする
public $timestamps = false;
をモデル内に追加しましょう。
例
データベースの接続、マイグレーションの利用で作成したhistory_listテーブルのクラスは下記のようになります。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class History extends Model
{
//テーブルの指定
protected $table = 'history_list';
//プライマリーキーを設定
protected $primaryKey = ‘code’;
}
eloquentの利用
レコードの追加
レコードの追加はモデルのインスタンスを作成し行います。
ここではpatient_listテーブルにレコードを追加するため、Patientモデルを使用します。
$test_recode = App\Patient;
これで$test_recodeを編集することでPatientモデル(patient_listテーブル)へのレコードが追加できます。
それでは各カラム値にデータを入力します。
$インスタンス名->カラム名 = '入力値'
が雛形です。
今回は例として下記のように入力しました。
$test_recode->name1 = '山田 太郎';
$test_recode->name2 = 'やまだ たろう';
$test_recode->sex = '男性';
$test_recode->birthdate = '20160101';
$test_recode->phone_num = '01201111111';
$test_recode->zip = '1234567';
$test_recode->address = '東京都杉並区11';
$test_recode->ad = 'ホームページ';
$test_recode->experience = 'あり';
$test_recode->firstday = 'date';
$test_recode->memo = 'テストです';
これでインスタンスにデータが入力できたので、それをテーブルに反映sるためsaveメソッドを実行します。
$test_recode->save();
これでテーブルへのレコード挿入が完了です。
テーブル内のデータを呼び出すスタティックメソッドall()を利用し確認します。
App\Patient::all();
下記のように表示され