withメソッドは主にEloquentのwithとviewのwithがある。
Eloquent リレーションシップでの “with”
Eloquentモデルでリレーションシップを定義する際に使用される “with” メソッドは、Eager Loading(前もって関連するモデルを読み込むこと)を行います。
例えば、User
モデルが posts
リレーションシップを持っている場合、User::with('posts')->get()
を使用すると、各ユーザーとその関連するポストが一度のクエリで取得されます。
$users = User::with('posts')->get();
ビューでの “with”
Bladeテンプレートでビューにデータを渡す際に、”with” メソッドを使用します。このメソッドは、ビューに追加のデータを提供するために使用されます。
例えば、view 関数を使用してビューを返す際に、”with” メソッドを使ってデータを渡すことができます。
return view('welcome')->with('message', 'Hello, World!');
viweのwithはよく一時的なメッセージをセッションに入れて渡すことがあります。
withで渡した場合、データオブジェクトとして渡され、直接セッションには保存されません。
なのでリロードやページ遷移をして戻った場合はデータは消えます。
リダイレクトしてコントローラーでデータを取りたい場合。
リダイレクト後にセッションに保存されるので
$msg = $request->session()->get('message');
もしくは、
$msg = $session('message');
として、データを取得できます。
この場合も、リダイレクトなどすると、withで渡したデータは消えてします。
なので一時的に表示したいメッセージなどを渡すのがよい。
ちなみに同じように一時的なメッセージを表示するのにflash()があるが、
これは特別なSessionに保存されるので、他ページに移動してからページに戻ったときやリロードの場合もデータは残らない。
blade側での取り出しは通常の変数ではなく、セッションから取り出す。
@if (\Session::has('message'))
<div class="alert alert-success">
{{ \Session::get('message') }}
</div>
@endif
例えば、エラーメッセージは一時的なものにして、入力データは保持したい場合、return viewやredirectでデータを渡して、withも渡すようにする。
return view('view_name', $responses) -> with('error_message',$errmsg);
bladeでの受け取り
コントローラーから渡された場合
<p>{{$error_message}}</p>
というように使える。