私はsymfonyとdoctrineをORMとして使用し、利用可能なタイプではarray、simple_array、またはjson_array Iそれらのそれぞれの間の違いは何ですか?そして、どちらを使用するか?違いを説明するために、それぞれのショーケースはありますか?
すでにいくつかのアプリケーションでsimple_arrayを使用していますが、formTypeでのレンダリングがあまりよくないことがわかります...(または、うまく使用していないかもしれません!?)
私の質問を説明するために、ここにショーケースがあります:
特定の週の日に実行する必要があるタスクがあるので、TaskEntity with days属性を作成しました
日は次のようになります。
$days = array(
1=>true,
2=>true,
3=>true,
4=>true,
5=>true,
6=>false,
7=>false
);
しかし、私は選択する魔女のタイプがわからない...
あなたの問題について_simple_array
_が正しい方法であり、正しい方法は7つのブールフィールドを作成することもあります。
ただし、次のような小さなVademecumがあります。
doctrineで型がどのように機能するかを見る最良の方法は、型のコードを読むことです。これは、当然のことと考えられたり、ドキュメントで実際に説明されていない詳細がいくつかあるためです.
だからあなたはに入ることができます
_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php
_
タイプを見つけ、そのメソッドが希望どおりに機能するかどうかを確認します。
ここにいくつかの詳細:
_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php
_
_return implode(',', $value);
_
これは、アイテムのimplode()
/explode()
であり、値のみを格納します。データベースを簡単に照会できるので便利です。
_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php
_
_return serialize($value);
_
PHP to serialize()
/unserialize()
に呼び出します。_json_array
_よりも高速です。コードを見ると、オブジェクトでも機能すると思います。フィールドがプレーンテキストとして表示される場合、それは理解できません。
_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php
_
_return json_encode($value);
_
json_encode()
/json_decode()
を呼び出します。フィールドを見ると、フォーマットされていないJSON配列を見ることができますが、PHPのシリアル化されたオブジェクトより読みやすく、実際に移植性があります(JSONはどこにでも存在します)。
2018年6月更新
別の考慮事項:ここに示すような真/偽の値の小さなセットを表す最も効率的な方法は、 ビットフィールド です。
この方法では、完全な文字列ではなく1つの整数のみを保存します。また、エンコード/デコードのオーバーヘッドを回避できます。
良い例については、 https://stackoverflow.com/a/5412214/827254 をご覧ください。
前述のように、問題に対する最善の解決策は、タイプarray
または_json_array
_の配列マッピングを使用することですが、not _simple_array
_です。理由は、_simple_array
_のシリアル化メソッドはimplode(',', $array)
の呼び出しであり、配列のキーではなく値のみを保持するため、連想性がある状況では無効だからです。アレイ。
ただし、_$days
_属性を0ベースの配列としてモデル化することもできます(つまり、mondayはゼロ、tuesdayは1など)。その場合、explode(',', $serialized);
で逆シリアル化すると、シリアル化された値を持つ0ベースの配列が生成されるため、機能します。
ドキュメントによると:
Doctrine ORM > 基本マッピング > Doctrineマッピングタイプ
配列データを保存する3つの選択肢があります。
array
SQL CLOBをserialize()
およびunserialize()
を使用してPHP配列にマッピングする)タイプ。
_simple_array
_ implode()
およびexplode()
を使用してSQL CLOBをPHP配列にマッピングするタイプ)、区切り文字としてコンマを使用します。
重要:値に_
,
_を含めることができないことが確実な場合にのみ、このタイプを使用してください。
_json_array
_ json_encode()
およびjson_decode()
を使用して、SQL CLOBをPHP配列にマッピングする)型。
したがって、配列値に_,
_(コンマ)が含まれないことが確実な場合は、_simple_array
_を使用してください。単純な配列構造(線形)がある場合はarray
を使用し、より複雑なキー値配列がある場合は_json_array
_を使用します。