2017-08-29 14 views
0

セッションに複雑なレコードが格納されています。セッションでこのレコードの一部を更新し、DB行をセッションデータで更新します。これまでのところ、私は意図していた部分だけでなく構造全体を上書きすることができました。Laravelセッション変数が更新されていません

例:

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); 

最後に、このレコードをt

Progress::find($id)->update(session()->get('base')); 

JSON /配列フィールドの1つだけをセッションで更新するにはどうすればよいですか?

UPDATE:私は、コメントを追加しました:

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

しかし、それでもまだ、私は$cards配列を取得dd(session()->get('base'))とき!

+0

を行うことができます::あなたのアプリにsave() '? – Tschallacka

+0

私はしません。しなければならない? Taylorのドキュメントではこれについて言及していませんか? – TheRealPapa

+0

はい、する必要があります。通常、プログラムの終了時に、アプリケーションが終了するときには、通常、Session :: save()の呼び出しが含まれます。これにより、セッションデータがセッションドライバに書き込まれることが確認されます。 – Tschallacka

答えて

1

あなたの問題は、意図されていない方法でセッションを使用していることが原因であると考えられます。 ProgressというEloquentモデルをキー 'base'を持つセッションに格納しておき、モデルのパラメータとやりとりする方法を理解するには、getputpush Sessionメソッドが必要です。などこれを行うどのように操作することが、それを引き出したいときに、その後の人生シンプルに、ちょうどセッションに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); 
関連する問題