Laravelでデータの一覧表示(実践編その2)

今日は、データベーステーブルから取得してきたデータの一覧を表示する方法を調べてみましょう。前回の『Laravelでデータの新規作成』では、データの作成後も新規作成のページを表示したままでした。今日は、データの入力後にデータの一覧ページへ移動するように作成したいと思います。

Fluentクエリービルダーでデータの一覧表示

1. それでは、トップページでデータの一覧を表示するようにしたいので、indexアクションを作成します。

laravel/application/controllers/collection.php

//Topページ
 public function action_index(){
 //データベースからレコードを配列で取得
 $data['collections']=DB::table('collections')
 //降順に並び替え
 ->order_by('created_at','desc')
 ->get();
 //取得したデータをビューに渡す
 return View::make('collection/index',$data);
 }

2. ビューファイルを下記のように作成します。

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

@layout('layouts.master')
@section('content')
トップページです
<table class="table table-striped table-bordered">
 <tr>
 <th>id</th>
 <th>タイトル</th>
 <th>作成日</th>
 <th>更新日</th>
 <th>保管場所</th>
 </tr>
@foreach($collections as $row)
 <tr>
 <td>{{ $row->id }}</td>
 <td>{{ $row->title }}</td>
 <td>{{ $row->created_at }}</td>
 <td>{{ $row->updated_at }}</td>
 <td>{{ $row->save_space }}</td>
 </tr>
@endforeach
</table>
@endsection

3. ブラウザで表示してみましょう。最後に登録したデータが一番上に表示されています。

EloquentORMでデータの一覧表示

4. それでは、次にEloquentORMでデータを一覧表示してみましょう。indexアクションの3~7行目を下記のように修正します。

laravel/application/controllers/collection.php

//EloquentORMでテーブル全体を取得
 $data['collections']=Collection::all();

EloquentORMでテーブル全体を取得するには、staticのallメソッドを使うだけで全てのデータを取得することが出来ます。

5. ブラウザで確認してみます。ものすごく簡単ですね。

6. 只、単純に何の加工もせずに全てのデータを取得することはあまりないと思います。条件でデータを絞り込むにはどうすればいいのでしょう。驚くことにEloquentORMでは、Fluentクエリービルダーの全てのメソッドを利用できるのです。つまり、Fluentクエリービルダーのメソッドを覚えればほぼ、EloquentORMも使いこなせるということです。これはすごいですね。

7. それでは、このデータを降順に並べ替えて取得してみましょう。先程のallメソッドを下記のように修正します。

laravel/application/controllers/collection.php

//EloquentORMでレコードを降順で取得
 $data['collections']=Collection::order_by('created_at','desc')->get();

いきなりの、order_byには驚きました。普通は、モデルをインスタンス化してから、チェーンメソッドで、order_byするのですが、その辺の手順を全て省略して、order_byをstaticなメソッドとして作成している発想の柔らかさには驚嘆です。

尚、条件に合った全てのデータを取得するには、getメソッド、一つのデータだけを取得するにはfirstメソッドを使って下さい。

8. これで、3.のブラウザと同じデータを表示します。

Creatアクションの修正

9. それでは、データ入力後トップページへ移動するように、createアクションを下記のように修正します。

laravel/application/controllers/collection.php

//新規作成createアクション
 public function action_create(){
 //もしtitleが送信されたら
 if(Input::get('title')){
 //データの整理
 $data['title']=Input::get('title');
 $data['col_code']=Input::get('col_code');
 $data['save_space']=Input::get('save_space');
 //Fluentクエリービルダーでデータの新規作成
 //$create=DB::table('collections')->insert($data);
 //EloquentORMでデータの新規作成
 $create=Collection::create($data);
 //トップページへリダイレクト
 return Redirect::to('collection/index'); 
 }
 return View::make('collection.create');
 }

14行目のRedirectクラスのtoメソッドのパスは、必ず、”/”で指定して下さい。16行目のViewクラスのmakeメソッドのようにピリオド”.”で指定したら、エラーになります。尚、前回もいったようにViewクラスのmakeメソッドは、ピリオドでもスラッシュでも大丈夫です。

10. これで、データを新規登録したら、トップページ(index.bleade.php)へ移動するようになりました。

getメソッドとfirstメソッドの違いについて

11. EloquentORMのgetメソッドとfirstメソッドは、根本的な違いがありますので、その違いについて記述しておきます。

12. allメソッド及びgetメソッドは、モデルの配列を返し、firstメソッドはモデルを一つだけ返すという点です。この違いをよく理解しておかないとビューファイルの表示方法でエラーが発生します。

13. つまり、allメソッド及びgetメソッドで取得したデータは、オブジェクトの配列で有り、firstメソッドで取得した配列データは1個の配列オブジェクトであるということです。firstメソッドで取得したデータを上記のindex.blade.phpビューでは表示できません。

14. それでは、上記の7.のcollectionコントローラを下記のように修正してみます。

//EloquentORMでデータを1件取得
 $data['collections']=Collection::order_by('created_at','desc')->first();

15. ブラウザ確認してみます。『存在しないオブジェクトのプロパティを取得しようとしている』とエラー表示されました。

16. それでは、エラーを修正するために、indexビューを修正します。

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

@layout('layouts.master')
@section('content')
トップページです
<table class="table table-striped table-bordered">
 <tr>
 <th>id</th>
 <th>タイトル</th>
 <th>作成日</th>
 <th>更新日</th>
 <th>保管場所</th>
 </tr>
 <tr>
 <td>{{ $collections->id }}</td>
 <td>{{ $collections->title }}</td>
 <td>{{ $collections->created_at }}</td>
 <td>{{ $collections->updated_at }}</td>
 <td>{{ $collections->save_space }}</td>
 </tr>
</table>
@endsection

17. ブラウザで確認してみます。下記のようになりました。

18. 初心者が必ず通る道だと思いますが、私みたいに独学で勉強しているものにとっては、些細な事で躓くとかなりな時間をロスしてしまいます。私の躓いた経験が役に立てばと思い記述してみました。

本日は以上です。

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

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

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

トラックバック

コメント

  1. HiroKws より:

    私のほうが記事に間違いが多いので、差し出がましいですが、一つだけ。:D
    「13. つまり、allメソッド及びfirstメソッドで取得したデータは、オブジェクトの多重配列で有り、firstメソッドで取得した結果は1個のオブジェクトであるということです。」
    直前の12を書いていらっしゃるので理解されて入れておられるようですので、書きたかった内容はは、これだと推測しました。
    ただ、first()の結果のオブジェクトの属性(データベースのフィールドのSELECT結果)には、$result->usernameでも、$result[‘username’]でもアクセスできますから、配列が好きな方は配列として扱えると理解しても間違いはありませんね。
     
    ピリオドとスラッシュの区切りの件はややこしいですね。私も本家のフォーラムで愚痴ったことがあります。いっそ全部ピリオドで指定できるようにしてくれれば、簡単なんですけどね。
     
    「いきなりの、order_byには驚きました。普通は、モデルをインスタンス化してから、チェーンメソッドで、order_byするのですが、その辺の手順を全て省略して、order_byをstaticなメソッドとして作成している発想の柔らかさには驚嘆です。」
    便利ですね。実は、最近のフレームワークはこういうことができるものが多いです。もともと、PHPにはこうした柔軟な使用ができる機能は備わっています。ただ、一般的なPHPユーザーが自由に使いこなすには、手間がかかりますので、そこはフレームワークに面倒を見てもらいましょう。Laravelのように、柔軟に扱ってくれると、いいですね。
    ちなみに、Eloquentモデルを拡張したモデルにpublic function aaaaa()と、staticではなく、通常の動的なメソッドを書き、それをmyModel::aaaaa()で呼び出すこともできます。(はずです。 😀 )
    コードはlaravel/database/eloquent/model.phpの中の最後の関数__callStatic()です。時間があるときに研究すると面白いですよ。ちゃんと、モデルをインスタンス化して読んでいます。 😉

    • nakada より:

      川瀬 様
      ご指摘ありがとうございます。
      読み返してみると確かにおかしな文面ですよね。
      私が配列を覚え立ての頃、配列と多重配列の区別がつかず、データを取得するのにすったもんだしたことがあったので、記述してみました。
      只、オブジェクトと配列はきちんと分けないといけませんよね。
      これからもよろしくお願いいたします。
      WinRoad徒然草管理人 中田


コメントをどうぞ

このページの先頭へ