LoginSignup
406
421

More than 3 years have passed since last update.

[laravel] controllerからviewへの変数の受け渡しとその展開方法

Last updated at Posted at 2016-08-12

laravel5でcontrollerから変数の受け渡し、viewでの展開の際に迷うのでメモ

1つの変数の送信

変数を一つ受け渡す場合はcompact関数又はwithメソッドで送信。
compactの方が可読性が高いのでそちらを使うことが多い。

compact関数の場合

testController.php

public function test() {

    $test_1 = "テスト";

    return view('test.normal',compact('test_1'));
}

withメソッドの場合

testController.php

public function test() {

    $test_1 = "テスト";

    return view('test.normal')->with('test_1',$test_1);
}

view側では通常の変数名で展開可能

<p>
    送られてきた変数は{{$test_1}}
</p>

複数の変数の送信

複数の変数の送信も単一と同じくcompact関数またはwithメソッドで送信可能。
withメソッドの場合は配列で送信する。

・compact関数の場合

testController.php

public function test() {

    $test_1 = "テスト1";
    $test_2 = "テスト2";

    return view('test.normal',compact('test_1','test_2'));
}

・withメソッドの場合

testController.php

public function test() {

    $test_1 = "テスト1";
    $test_2 = "テスト2";

    return view('test.normal')->with([
       "test_1" => $test_1,
       "test_2" => $test_2,
    ]);
}

view側では通常の変数名で展開可能

normal.blade.php
<p>
    送られてきた変数1は{{$test_1}}
    送られてきた変数2は{{$test_2}}
</p>

配列の送信

配列を受け渡す場合も通常の変数と同じ。以下よく使うcompact関数で説明。

testController.php

public function test() {

    $test_array = ["テスト1","テスト2", "テスト3"];

    return view('test.normal',compact('test_array'));
}

view側では通常の配列の展開で可能

normal.blade.php
<p>
    送られてきた配列の要素1は{{$test_array[0]}}
    送られてきた配列の要素2は{{$test_array[1]}}
    送られてきた配列の要素3は{{$test_array[2]}}
</p>

postデータの送信

postで受け取ったデータをそのまま次のviewに送信する場合。

まずフォーム画面

form.blade.php
<form action="form_post" method="post" accept-charset="utf-8">
        <!-- トークンの追加 -->
        {!! csrf_field() !!}
        <!-- テキストボックス -->
        <input type="text" name="textbox" value="">
        <!-- ラジオボタン -->
        <label>
            <input type="radio" name="radio-btn" value="選択1"> 選択1
        </label>
        <label>
            <input type="radio" name="radio-btn" value="選択2"> 選択2
        </label>
        <input type="submit" value="送信" >
</form>

postを受け取るcontroller
Requestクラスのallメソッドを使用しpostで送られたデータを取得。送信方法は通常の変数と同じ。

testController.php

    public function form_post(Request $request) {

        //ポストデータすべての取得
        $post_data = $request::all();

        return view('test.form_post',compact('post_data'));
    }

allメソッドでは連想配列で返されるので、view側では連想配列の展開

form_post.blade.php
<p class="text-center">
    テキストボックスは{{$post_data['textbox']}}
    ラジオボタンは{{$post_data['radio-btn']}}
</p>

eloquentで取得したデータベースの値の送信

使用するテーブルの構造

スクリーンショット 2016-08-12 11.02.14.png

内容
スクリーンショット 2016-08-12 14.51.15.png

モデルの構造


class dbtest extends Model
{
    protected $table = 'dbtest_table';
}

controllerの記載
変数の受け渡しは通常と同じ。


public function db_test() {

    //dbtest_tableの全データを取得
    $db_data = App\dbtest::all();

    return view('test.db',compact('db_data'));
}

viewではforeachを利用し各レコードを抽出し、さらに抽出したレコードに対しアロー演算子でプロパティを指定することで各カラムのデータを取り出す。

<table>
        <tr>
            <th>ID</th>
            <th>名前</th>
            <th>年齢</th>
        </tr>
        @foreach($db_data as $recode)
            <tr>
                <th>{{$recode->id}}</th>
                <th>{{$recode->name}}</th>
                <th>{{$recode->old}}</th>
            </tr>
        @endforeach
</table>

その他foreachを使わない場合は配列の行番号+プラスアロー演算子で表示もできる。

<p>
    {{$db_data[0]->name}}
</p>

なぜ$recodeでアロー演算子でプロパティの呼び出しを行うかというと、
eloquentで取得するデータはcollectionインスタンスとして返されるためである。
collectionインスタンスを利用するとレコードの数を数えたり

$count = $db_data->count();
//$count == 3;

カラムの平均値を出したりすることが出来る

$avg = $db_data->avg('old');
//$avg == 29.333;
406
421
2

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
406
421