Laravel データを渡す withメソッド

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>

というように使える。