【发布时间】:2018-02-06 19:05:39
【问题描述】:
我有一个复杂的记录存储在会话中。我想在会话中更新此记录的部分内容,然后使用会话数据更新数据库行。到目前为止,我已经设法覆盖了整个结构,而不仅仅是我打算覆盖的部分。
例子:
base <-- whole record
base.field1 <-- single field
base.field2 <-- single field
base.field3 <-- single field
base.users <-- array of objects (users), stored as JSON column
base.details <-- single dimensional array of fields
base.cards <-- array of objects (cards), stored as JSON column
base.regions <-- array of objects (regions), stored as JSON column
整个结构作为一行存储在progress 表中。
我像这样在会话中加载和存储这些数据:
session()->put('base', Progress::find($id));
然后我更新了卡片数组中的一些字段:
$cards = session()->get('base.cards');
$cards[$index]['points'] = 100;
然后我尝试(不成功)更新会话变量,尝试了以下两个:
session()->put('base.cards', $cards);
session()->push('base.cards', $cards);
session('base.cards', $cards);
最后我想通过更新它的实例将这条记录存储在进度表中,如下所示:
Progress::find($id)->update(session()->get('base'));
如何在会话中仅操作 JSON/数组字段之一然后更新?
更新:我补充说:
session()->put('base.cards', $cards);
session()->save();
但是,当我 dd(session()->get('base')) 时,我得到了 $cards 数组?!
【问题讨论】:
-
你在你的应用中在哪里调用
Session::save()? -
我没有。我一定要吗?泰勒的文档没有提到这一点?
-
是的,你必须这样做。通常在您的程序流程结束时,当您的应用程序将“终止”时,您通常会调用 Session::save()。这将确保将会话数据写入会话驱动程序。
-
如果一开始从数据库中读取,然后将其持久化到数据库,为什么还需要将其存储在会话中?
-
这不是问题所在。问题是如何操作/替换存储在会话结构中的数组。
标签: php session laravel-5.4