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

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

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

compact関数の場合

```php:testController.php

public function test() {

	$test_1 = "テスト";
	
	return view('test.normal',compact('test_1'));
}
```

withメソッドの場合

```php: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関数の場合

```php:testController.php

public function test() {

	$test_1 = "テスト1";
	$test_2 = "テスト2";
	
	return view('test.normal',compact('test_1','test_2'));
}
```

・withメソッドの場合

```php: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側では通常の変数名で展開可能

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

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

```php:testController.php

public function test() {

	$test_array = ["テスト1","テスト2", "テスト3"];
	
	return view('test.normal',compact('test_array'));
}
```
view側では通常の配列の展開で可能

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

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

まずフォーム画面

```html: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で送られたデータを取得。送信方法は通常の変数と同じ。

```php:testController.php

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

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

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

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

#eloquentで取得したデータベースの値の送信
使用するテーブルの構造

![スクリーンショット 2016-08-12 11.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/114396/9659c18c-c510-bb1b-f948-52e4ad3cda44.png "スクリーンショット 2016-08-12 11.02.14.png")

内容
![スクリーンショット 2016-08-12 14.51.15.png](https://qiita-image-store.s3.amazonaws.com/0/114396/e9e1b747-e715-c1c6-58b0-3a9f55af83ad.png "スクリーンショット 2016-08-12 14.51.15.png")



モデルの構造

```php

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

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

```php

public function db_test() {

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

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

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

```html
<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を使わない場合は配列の行番号+プラスアロー演算子で表示もできる。

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

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

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

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

```php
$avg = $db_data->avg('old');
//$avg == 29.333;
```