1
1

More than 3 years have passed since last update.

Laravel Eloquantを用いてデータを取り出す

Last updated at Posted at 2020-04-15

目的

  • Eloquantを用いたデータのやりとりの方法を学んだので忘れないようにまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提条件

  • 先に記載した実施環境にて下記のtodosテーブルがすでに存在している事とする。

    • todosテーブルのカラム設定

      Field Type Null Key Default Extra
      id bigint unsigned NO PRI NULL auto_increment
      user_id int NO NULL
      content varchar(255) NO NULL
      memo varchar(255) NO NULL
      priority int NO 1
      created_at timestamp YES NULL
      updated_at timestamp YES NULL
    • 先のtodosテーブルを作成した際のマイグレーションファイルの内容を下記に記載する。

      アプリ名ディレクトリ/database/migrations/2020_03_27_163741_create_todos_table.php
      <?php
      
      use Illuminate\Database\Migrations\Migration;
      use Illuminate\Database\Schema\Blueprint;
      use Illuminate\Support\Facades\Schema;
      
      class CreateTodosTable extends Migration
      {
          /**
           * Run the migrations.
           *
           * @return void
           */
          public function up()
          {
              Schema::create('todos', function (Blueprint $table) {
                  $table->id();
                  $table->integer('user_id');
                  $table->string('content');
                  $table->string('memo');
                  $table->integer('priority')->default(1);
                  $table->timestamps();
              });
          }
      
          /**
           * Reverse the migrations.
           *
           * @return void
      
    • 先のtodosテーブルに下記のデータが格納されている物とする。

      id user_id content memo priority created_at updated_at
      1 1 test test 1 2020-04-13 08:01:02 2020-04-13 08:01:02
      2 1 test2 test2 0 2020-04-13 09:15:15 2020-04-13 09:15:15
      3 1 test3 test3 2 2020-04-13 09:18:12 2020-04-13 09:18:12

事前知識

  • このアプリにはAuthを用いたログイン機能を実装してある。
  • URLローカルサーバのIP/user_homeにアクセスした際に、ログイン中のuser_idのテーブル内の「id」「content」「memo」を表で表示する。
  • ルーティングはアプリ名ディレクトリ/routes/web.phpに記載する。
  • コントローラのアクションはアプリ名ディレクトリ/app/Http/Controllers/UserHomeController.phpに記載する。
  • ビューはアプリ名ディレクトリ/resources/views/home/user_home.blade.phpに記載する。

実施方法概要

  1. モデルの作成(未実施の場合のみ)
  2. テーブルの紐付け
  3. データの抽出
  4. ルーティングの準備
  5. コントローラの準備
  6. ビューの準備
  7. 確認

実施方法詳細

  1. モデルの作成(未実施の場合のみ)

    1. アプリ名ディレクトリで下記コマンドを実行する。

      $ php artisan make:model Todo
      
    2. アプリ名ディレクトリ/app直下にTodo.phpファイルが作成されている事を確認する。

  2. テーブルの紐付け

    1. アプリ名ディレクトリで下記コマンドを実行してモデルファイルを開く。

      $ vi app/Todo.php
      
    2. 下記のように記載されている事を確認する。

      アプリ名ディレクトリ/app/Todo.php
      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Todo extends Model
      {
          //
      }
      
      1. 下記のように修正してtodosテーブルを紐づける。
      アプリ名ディレクトリ/app/Todo.php
      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Todo extends Model
      {
          protected $table = 'todos';
      }
      
  3. ルーティングの準備

    1. アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php
      
    2. 開いたルーティングファイルに下記の内容を記載する。

      アプリ名ディレクトリ/routes/web.php
      Route::get('/user_home', 'UserHomeController@user_home');
      
  4. コントローラの準備

    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller UserHomeController
      
    2. アプリ名ディレクトリ/app/Http/Controllers直下にUserHomeController.phpファイルが作成されている事を確認する。

    3. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを開く。

      $ vi app/Http/Controllers/UserHomeController.php
      
    4. 開いたコントローラファイルを下記のように修正する。

      アプリ名ディレクトリ/app/Http/Controllers/UserHomeController.php
      <?php
      
      namespace App\Http\Controllers;
      
      //先に作成したモデルの継承
      use App\Todo;
      //作成時から記載されていた継承
      use Illuminate\Http\Request;
      //Authを使ったログイン情報を得るための継承
      use Illuminate\Support\Facades\Auth;
      
      class UserHomeController extends Controller
      {
          //user_homeアクションを引数無しで定義する
          public function user_home() {
              //変数itemsにEloquantの機能を用いてtodosテーブルの全てのデータを格納する
              $items = Todo::all();
              //変数user_itemsに先に取得した変数itemsを変数userに格納した値でフィルターした値を格納する(フィルターの内容は次の行に記載)
              $user_items = $items->filter(function($user) {
                  //$変数userにusers_idがAuth::id()のフィルター内容を格納する。(Auth::id()は現在ログイン中のuser_idを取得している)
                  return $user->users_id === Auth::id();
              });
              //アプリ名ディレクトリ/resource/view/homeディレクトリにあるuser_home.blade.phpファイルを表示する。表示する際に、本アクションで定義した$user_items変数をitems変数としてビューファイルに渡す。
              return view('home.user_home', ['items' => $user_items]);
          }
      }
      
  5. ビューの準備

    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

      $ mkdir resources/views/home
      
    2. アプリ名ディレクトリで下記コマンドを実行してビューファイルを作成する。

      $ vi resources/views/home/user_home.blade.php
      
    3. 開いたビューファイルに下記の内容を記載する。

      アプリ名ディレクトリ/resources/views/home/user_home.blade.php
      <table>
          <tr>
              <th>id</th>
              <th>やること</th>
              <th>memo</th>
          </tr>
          <!-- コントローラから渡された変数itemsの内容を変数itemに格納してforeachの処理を実行する -->
          @foreach ($items as $item)
              <tr>
                  <td>{{$item->id}}</td>
                  <td>{{$item->content}}</td>
                  <td>{{$item->memo}}</td>
              </tr>
          @endforeach
      </table>
      
  6. 確認

    1. ローカルサーバを起動して下記にアクセスする。 -http://127.0.0.1:8000/user_home
    2. 下記のように表示される事を確認する。

      スクリーンショット 2020-04-14 13.16.44.png

1
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1