【问题标题】:Laravel session variable is not updatingLaravel 会话变量未更新
【发布时间】: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()-&gt;get('base')) 时,我得到了 $cards 数组?!

【问题讨论】:

  • 你在你的应用中在哪里调用Session::save()
  • 我没有。我一定要吗?泰勒的文档没有提到这一点?
  • 是的,你必须这样做。通常在您的程序流程结束时,当您的应用程序将“终止”时,您通常会调用 Session::save()。这将确保将会话数据写入会话驱动程序。
  • 如果一开始从数据库中读取,然后将其持久化到数据库,为什么还需要将其存储在会话中?
  • 这不是问题所在。问题是如何操作/替换存储在会话结构中的数组。

标签: php session laravel-5.4


【解决方案1】:

我认为您的问题是由您以非预期方式使用 Session 引起的。您似乎在 Session 中存储了一个名为 Progress 的 Eloquent 模型,其键为“base”,然后期待 Session 的 getputpush 方法来了解如何与模型的参数进行交互。

让生活变得简单,只需将 ID 存储在 Session 中...

$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 模型存在,以记录的方式访问。

将来他来审查此代码时,您将不胜感激:-)

哦,如果您因为担心速度而将模型存储在会话中,那么从正确索引的数据库中提取单个记录可能不会比从会话中提取数据慢。我们说的是数千秒,但请运行测试让您放心。

【讨论】:

    【解决方案2】:

    会话存储支持的复杂结构仅限于数组。

    要从键名中的. 语法中受益,您需要将模型转换为数组,例如:

    session()->put('base', Progress::find($id)->toArray());
    

    所以你可以稍后再做

    session()->put('base.cards', $cards);
    

    【讨论】:

      猜你喜欢
      • 2016-07-04
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多