代码之家  ›  专栏  ›  技术社区  ›  TheRealPapa

Laravel会话变量未更新

  •  1
  • TheRealPapa  · 技术社区  · 9 年前

    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/array字段之一?

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

    但是,当我 dd(session()->get('base')) 我得到了 $cards

    2 回复  |  直到 9 年前
        1
  •  4
  •   Martin Joiner    9 年前

    我建议您的问题是由您以非预期方式使用会话引起的。你似乎在存储一个雄辩的模型,名为 Progress 在具有键“base”的会话中,然后期望 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,该模型作为一个适当的雄辩模型存在,并以文档化的方式访问。

    将来,当他来查看此代码时,您将非常感激:-)

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

        2
  •  0
  •   Alex Blex    9 年前

    . 在关键字名称中,您需要将模型转换为数组,例如:

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

    session()->put('base.cards', $cards);
    
    推荐文章