我试图通过AJAX在Laravel 5的会话中存储篮子数据,但每次我尝试将一个项目推送到存储为数值的数组时,现有的'篮'数组被覆盖。
以下是我的控制器方法:
public function add(Request $request)
{
$success = false;
if ($request->ajax()) {
$ticket = Ticket::find((int) $request->get('ticket_id'));
if ($ticket) {
if (!$request->session()->has('basket')) {
$request->session()->put('basket', []);
}
$item = [
'attraction.name' => $ticket->attraction->name,
'ticket.quantity' => $request->get('quantity'),
'ticket.price' => $ticket->price,
];
$request->session()->push('basket', [$ticket->id => $item]);
$success = true;
}
}
return response()->json(['success' => $success]);
}
在第一个实例的篮子会话数组中设置了一个项目,但是当我将更多项目数据发布到此方法时,我希望它能够添加到此数组而不是覆盖。
我希望实现的最终结果是:
Array
(
[basket] => Array
(
[123] => Array
(
[attraction.name] => Attraction 1
[ticket.quantity] => 2
[ticket.price] => 14.5
)
[456] => Array
(
[attraction.name] => Attraction 2
[ticket.quantity] => 3
[ticket.price] => 12
)
)
)
我尝试过使用Session facade等效方法,但无济于事:(
非常感谢任何帮助。谢谢:))
答案 0 :(得分:0)
似乎每次使用push
时,都会覆盖购物篮中的现有商品。在push
之前,从会话变量获取已存在的所有内容,将其合并(array_merge
)与您要添加的内容然后存储在会话中。
这样你就不会失去已经在篮子里的东西。
答案 1 :(得分:0)
我曾尝试array_merge()
,但我的会话再次被覆盖。所以,在再次调试我的调试帽后,我发现了它发生的原因。
每次请求后,会话数据都不会持久存在。由于我的会话没有被记住,!$request->session()->has('basket')
总是在评估true
因此我的篮子会话每次都被设置回一个空数组。
我需要使用以下行将我的请求作为JSON返回,以便我的会话数据保持不变。也许这是因为我在AJAX调用中将dataType: 'json'
作为属性?
return response()->json($request);
我也接受了你的建议并抓住了篮子会话阵列,将新数据推送到它并重新进入会话。
排序!谢谢你的帮助:))
答案 2 :(得分:0)
我遇到了类似的问题,发现在为会话添加值后需要调用
session()->save();