症状
例えばレンタカーの予約フォームを作るとして、予約モデルを作成して入力した値をfillしセッションに保存しながら最終画面でsave()
し、DBに反映させるとします。
予約モデルは車モデルとリレーションをはってると思いますが、戻るなどして違う車を選んだ場合、モデルにcar_idをfillしなおしたにも関わらず、viewなどで$reservation['car']['name']
としても前に選択した車の名前が表示されてしまします。
対処法
そういう時は、$reservation->setRelations([])
を入れてやりましょう。
キャッシュされてたcarの中身がクリアされ、新しい内容が反映されます。
App/Reservation.php
...
class Reservation extends Model
{
protected $fillable = ['car_id'...];
public function car()
{
return $this->belongsTo(Car::class);
}
...
}
OrderController.php
...
class OrderController extends Controller
{
public function input1(Request $request)
{
$reservation = Session()->get('Reservation') : app(Reservation::class);
return view('order/input1', [
'cars' => Car::all(),
'reservation' => $reservation
]);
}
public function store1(Request $request)
{
$data = Validator::make($request->all(), [
'car_id' => 'required',
])->validate();
$reservation = Session()->get('Reservation');
$reservation->fill($data);
$reservation->setRelations([]); //これ!!リレーション先をクリア。
Session()->put('Reservation', $reservation);
return redirect('order/input2');
}
public function input2(Request $request)
{
...
}
...
public function storeN(Request $request)
{
...
$reservation = Session()->get('Reservation');
$reservation->fill($data)->save();
return view('order/gooooal');
}
...
}
おわりに
ソースがテキトウですが、備忘録的なメモです。
参考