如何修复Laravel Livewire中sync后关联数据首次为空的问题?
解决Livewire中首次提交订单后关联商品为空的问题
问题原因
你在调用updateOrCreate时预加载了products关联,但此时订单还未关联任何商品,所以预加载的products是空数组。后续执行sync同步购物车商品到订单后,$order对象里的products还是之前预加载的旧数据,不会自动更新。第二次点击时,updateOrCreate会重新从数据库查询订单,此时商品已经同步完成,预加载的products就能拿到正确数据。
解决方案
方案1:同步后重新加载关联
在执行sync之后,调用load方法重新拉取最新的products关联数据:
$order->products()->sync($products); // 重新加载products关联 $order->load('products'); // 此时dd($order->products)就能获取到同步后的商品数据 dd($order->products);
方案2:移除不必要的预加载
既然updateOrCreate执行时订单还没有关联商品,预加载products完全没有意义,直接去掉预加载配置里的products部分:
$order = Order::with([ 'address' => fn ($q) => $q->with('governorate', 'city'), 'user' // 移除products的预加载项 ])->updateOrCreate( // ... 原有条件和字段 );
之后访问$order->products时,Laravel会自动懒加载最新的关联数据。
方案3:重新查询订单对象
如果需要确保拿到完整的最新订单数据,可以在同步后重新查询一次订单:
$order->products()->sync($products); // 重新查询订单并加载products关联 $order = Order::with('products')->find($order->id); dd($order->products);
另外注意:你代码里的dd($order->product)应该是笔误,正确的属性名是$order->products(多一个s)。
内容的提问来源于stack exchange,提问作者Ahmed Alaa El-Din Hassan
相关产品推荐
相关产品推荐

