LoginSignup
0

More than 3 years have passed since last update.

posted at

Eloquentのモデルをセッションで引き回す時、リレーション先の内容が更新されないんですが

症状

例えばレンタカーの予約フォームを作るとして、予約モデルを作成して入力した値を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');
    }
    ...
}

おわりに

ソースがテキトウですが、備忘録的なメモです。

参考

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
What you can do with signing up
0