Laravelでデータの新規作成(実践編その1)

さて、今日からいよいよ実践編に突入したいと思います。基本的にデータベーステーブルは以前から(FuelPHPやCakePHPで)使用しているcollectionsテーブルを使用します。データベーステーブルの作成方法は、『CakePHP2.1でデータの新規作成(実践編その1)』をご覧下さい。

1. データベースへの接続方法ですが、FluentクエリービルダーとEloquentORMを同時進行で使用して行きたいと思います。尚、最終的にはEloquentORMでの作成が中心になるとは思いますが、一応Fluentクエリービルダーの使用方法も覚えようと思います。

Collectionコントローラの作成

2. まずcollectionコントローラを作成し、createアクションを作成します。

laravel/application/controllers/collection.php

<?php
class Collection_Controller extends Base_Controller{
 //新規作成createアクション
 public function action_create(){
 return View::make('collection.create');
 }
}

3. ルーターにcollectionコントローラを追加登録します。

laravel/application/routes.php

Route::controller(array('hello','home','login','collection'));

データ登録用フォームの作成

4. これで、collectionコントローラを使用する準備は出来ました。次にviewsフォルダに新しくcollectionフォルダを作成し、ビューファイル(create.blade.php)を下記のように作成します。尚、テンプレートは『LaravelのBladeテンプレート』で作成した、マスタービュー(master.blade.php)を使用します。

laravel/application/views/collection/create.blade.php 

@layout('layouts.master')
@section('content')
 {{ Form::open('collection/create','POST',array('class'=>'form-horizontal')) }}
 <fieldset>
 <div class="control-group">
 {{ Form::label('title','タイトル名',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('title') }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('created_at','作成日',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('created',date("Y-m-d H:i:s")) }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('col_code','コード番号',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('col_code') }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('save_space','保管場所',array('class'=>'control-label')) }}
 <div class="controls">
 <div class="control-group form-inline">
 {{ Form::text('save_space') }}
 </div>
 </div>
 <div class="form-actions">
 {{ Form::submit('新規登録',array('class'=>'btn btn-primary')) }}
 </div>
 </fieldset>
 {{ Form::close() }}
 @endsection

5. それでは、ビューファイルを表示してみます。下記のようになりました。

Fluentクエリービルダーでデータの新規作成

6. フォームからデータを入力してデータベーステーブルに登録してみましょう。createアクションを下記のように修正します。

laravel/application/controllers/collection.php

public function action_create(){
 //もしtitleが送信されたら
 if(Input::get('title')){
 //データの整理
 $data['title']=Input::get('title');
 $data['created']=Input::get('created');
 $data['col_code']=Input::get('col_code');
 $data['save_space']=Input::get('save_space');
 //Fuluentクエリービルダーでデータの新規作成
 $create=DB::table('collections')->insert($data);
 }
 return View::make('collection.create');
 }

FuelPHPでは、フォームからの送信をInput::method=’POST’で確認していました。Laravelにはリクエストの種別を調べるメソッドはなさそうですが(Request::method()で現在のリクエストのメソッドを取得することはできますが)、Input::getメソッドで、入力アイテムの有無を確認できます。入力アイテムが存在しない場合、null値が返りますので、条件分岐として利用しました。まだバリデーションの設定もしていませんので、空白や条件以外の文字列も入力できますが、今はとりあえずこれでいいと思います。

Fuluentクエリービルダーではデータの新規作成は、insertメソッドを使用します。

7. それでは、データを入力してみます。

8. phpMyAdminで確認してみます。データが追加されているのが確認できました。

9. 尚、今発行したSQLはLaravelの’profile’を有効にしていると表示されている下の①SQLの文字をクリックすれば、②確認できます。

EloquentORMでデータの新規作成

10. それでは、次にEloquentORMでデータを登録してみましょう。

11. EloquentORMを利用するには、『Laravelのデータベース設定』でも述べましたが、モデルを作成する必要があります。Collectionモデルを下記のように作成します。

laravel/application/models/collection.php

<?php
class Collection extends Eloquent{
}

EloquentORMのcreateメソッド

12. EloquentORMでデータを新規作成するにはモデル名::create()のようにceateメソッドを使用します。createメソッドは、新しいレコードをデータベースに挿入し、その新しいレコードのインスタンスを返します。尚、挿入に失敗すると、falseを返します。

13. それでは、collectionコントローラの9~10行目を下記のように修正します。

laravel/application/controllers/collection.php

//EloquentORMでデータの新規作成
 $create=Collection::create($data);

14. それでは、ブラウザからデータを入力してみます。

15. おーっとエラーが表示されました。これは何故でしょう。エラーをよく見ると作成したはずの無い、’updated_at’と’created_at’をSQLが勝手に挿入しようとしています。

EloquentORMの日付自動入力

16. これは、EloquentORMの標準仕様で、自動的にcreated_at(作成日時)とupdated_at(更新日時)をデータベーステーブルに書き込むようになっているのです。

17. それでは、collectionsテーブルにcreated_atとupdate_atをdate型で追加します。尚、CakePHPで標準となっているcreatedとmodifiedの名称を変更しても構いません。今回はこちらの手続きで対応します。

18. 尚、createdを修正する場合は、上記フォームのcreated(ビューファイルcreate.blade.phpの11行目から16行目まで)を削除して、cerateアクションの6行目も削除します。

19. それでは、修正したら、ブラウザから再度入力してみます。

20. phpMyAdminで確認したら、データが挿入されたのが確認できました。

22. Laravelの日付自動入力は、FuelPHPのoilで作成したモデルと同じフィールド名ですね。只、FuelPHPでは、モデル内に記述しなければなりません。コードジェネレーターをほとんど利用しない人にとっては、Laravelの方が簡単ですね。

23. 尚、CakePHPも自動的に日付入力しますが、こちらのテーブルフィールド名は、新規作成がcreatedで更新がmodifiedです。

Viewクラスのmakeメソッドについて

24. 今まで、Viewクラスのmakeメソッドでパスはピリオド”.”を使っていましたが、私の記述ミスで、スラッシュ”/”を使用したところ、何の問題も無くビューファイルを表示することが分かりました。

25. 公式ドキュメントには、『コントローラのネストの項目で、ネストしたコントローラ(サブフォルダ内のコントローラ)を指定する場合は、ピリオドでルートに登録します。』とあり、Viewクラスのmakeメソッドも公式ドキュメントでは、ピリオドで記述していましたので、何の疑いも無く、makeメソッドは、ピリオドでパスを指定するものだと思っていました。

26. 確かにルートでサブフォルダ内のコントローラを指定する場合は、ピリオドで指定しなければ、コントローラを認識しないのは検証しました。

27. ところが、Viewクラスのmakeメソッドでは、ピリオドでも、スラッシュでも指定のビューファイルを表示するのが分かりました。まあ、こちらの方が、記述ミスが少なくなって助かりますが。尚、本件も私の検証に間違いがあった場合は、後日修正します。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

トラックバック

コメント

  1. Senju より:

    こんにちは、いつも勉強させてもらっています。
    僕はまだまだ、未熟者で恐縮なのですが、データの入力が以下のように簡単に入力できましたので、報告です。

    public function postInsert2(Request $request)
    {
    $data = $request->all();
    $this->customer->fill($data);
    $this->customer->save();

    return view(‘customer.insert’,$this->data);
    }

    ちなみに以下のブログを参考にしました。

    http://blog.asial.co.jp/1360(記事の投稿より)

    fillがセキュリティ的に問題ないのであれば、これからも使っていこうかなぁと思っています。今は調査中です。ただ、以下のようなセキュリティリスクもあり得る気がして、少しだけ不安です。

    if ($_SERVER[“REQUEST_METHOD”] == “POST”) {
    foreach($_POST as $key => $value){
    $$key = $value;
    }
    PHPstormのFind Usagesでちょっぴりメソッドを調べてみたのですが、何しろ未熟すぎてさっぱりです。

    フレームワークを利用する前は、配列に全てのキーを入れてループで回していました。Laravelではたった3行で、完了するなんてすごすぎです。

    カラムが多くなると、毎回、入力の手間がかかるので、fillが活用できるとすごく便利ですね。


コメントをどうぞ

このページの先頭へ