我在会话中存储了一个复杂的记录。我想在会话中更新此记录的部分内容,然后使用会话数据更新数据库行。到目前为止,我已经设法覆盖了整个结构,而不仅仅是我想要的部分。
示例:
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
数组?!
答案 0 :(得分:2)
我建议您的问题是由于您以非预期方式使用Session而导致的。您似乎在会话中存储了一个名为Progress
的Eloquent模型,其中包含密钥&#39; base&#39;然后期望Session的get
,put
和push
方法了解如何与您的模型参数进行交互。
如何让生活变得简单,只需将ID存储在会话中......
$progress = Progress::find($id);
session()->put('progress_id', $progress->id );
session()->save();
然后当你想把它拉出去操纵时,保存在数据库中等做这个......
$progress_id = session()->get('progress_id');
$progress = Progress::find($progress_id);
$progress->cards = $cards->asJSON(); // Give your cards model a method that serialises itself
$progress->save();
总的来说,您的代码现在更易于阅读,并且所有内容都在非常正常的情况下使用。办法。会话只是持有一个ID,模型作为一个正确的Eloquent模型存在,以文档的方式访问。
未来您将在审核此代码时感激不尽: - )
哦,如果你因为担心速度而在会话中存储模型,那么从正确索引的数据库中提取单个记录可能并不比从会话中提取数据慢。我们正在谈论数千秒,但请进行测试以放心。
答案 1 :(得分:0)
会话存储支持的复杂结构仅限于数组。
要从键名中使用.
语法,您需要将模型转换为数组,例如:
session()->put('base', Progress::find($id)->toArray());
所以你可以稍后再做
session()->put('base.cards', $cards);