LoginSignup
1
0

More than 3 years have passed since last update.

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

Posted at

症状

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

おわりに

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

参考

1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0