2017-12-20 22 views
-1

エンティティをエンコードする際に、末尾にスラッシュ理由:JSON配列 -

//... 
/** 
* @ORM\Column(type="json_array", nullable=true) 
*/ 
protected $params = null; 

function setParams($params) 
{ 
    $this->params = $params; //json_encode($params); 
} 

とフォームタイプ:

//... 
     ->add('params', null, array(
      'required' => false, 
     )) 

だから、何も珍しいです。上のコードは正しく動作します。しかし、setParamsメソッドの行を "json_encode($ params);に変更すると(右のPHPのコメントを参照)、私はDB内の後続のスラッシュを取得しています(私はvarをダンプするとき、DBに格納する前に大丈夫です)。そして、それはDBでのみ間違っていて、私がそれをエンコードしようとするときだけです。興味深いことに、配列をsetParamsに直接渡すだけで十分です。Doctrineはそれを正しく保存します...

誰かが私の理由を説明できますか?

+0

「悪い」データを*記述する代わりに、代わりに例をコピー/貼り付けする方法はありますか? – Sammitch

+0

@Sammitch問題に直接関連するコードだけを入力しないと、そのポイントがぼやけます。 – forsberg

+0

私は@Sammitchに同意します。これらの後続のスラッシュの例がデータベースで発生しているのを見てみたいと思います。私はあなたが 'json_array'として列の型を定義して以来、自分でデータを' json_encode() 'するといくつかのダブルエンコーディングが起こっていると思っています。しかし、それを確認するために、間違ったデータの例を見る必要があります。 – rickdenhaan

答えて

1

json_arrayJSON(おかげでステファンVierkant)

はシリアライズJSONとしてデータベースにPHP配列/オブジェクトを格納するための教義型です。

パラメータをjsonではなく配列として設定する必要があります。ゲッターでsetParamsまたはjson_decodeの中にjson_encode($ params)を呼び出さないでください。 Doctrineはあなたのために汚い仕事をします。

function setParams(array $params) 
{ 
    $this->params = $params; 
} 

なぜエンティティの配列として使用し、データベースにシリアライズしたいのですか?

  1. それは高速ですが/ JSONより
  2. 一部のデータベースエンジンをネイティブPHPの配列を操作することは容易では、JSONのフィールド内で検索することができます
  3. シリアライズされたPHPやXMLよりも、あなたのDB管理システムで編集する方が簡単
+1

このタイプは2.6以降では非推奨です。代わりに 'json'を使用してください。それにもかかわらず+1。 –

+0

Thxこれを指摘してください。しかし、私は最新の3.x(3.4)Symfonyを使用しています.jsonが利用できないDoctrine dbal 2.5.13が付属しています。私は "不明な列タイプ" json "が要求されました。リンクはhttps://github.com/doctrine/dbal/blob/2.5/lib/Doctrine/DBAL/Types/Type.phpです。 – forsberg