web-dev-qa-db-ja.com

Doctrine array vs simple_array vs json_array

私はsymfonyとdoctrineをORMとして使用し、利用可能なタイプではarraysimple_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
);

しかし、私は選択する魔女のタイプがわからない...

51
0x1gene

あなたの問題について_simple_array_が正しい方法であり、正しい方法は7つのブールフィールドを作成することもあります。

ただし、次のような小さなVademecumがあります。

doctrineで型がどのように機能するかを見る最良の方法は、型のコードを読むことです。これは、当然のことと考えられたり、ドキュメントで実際に説明されていない詳細がいくつかあるためです.

だからあなたはに入ることができます

_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php
_

タイプを見つけ、そのメソッドが希望どおりに機能するかどうかを確認します。

ここにいくつかの詳細:

simple_array

_/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_よりも高速です。コードを見ると、オブジェクトでも機能すると思います。フィールドがプレーンテキストとして表示される場合、それは理解できません。

json_array

_/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php_

_return json_encode($value);
_

json_encode()/json_decode()を呼び出します。フィールドを見ると、フォーマットされていないJSON配列を見ることができますが、PHPのシリアル化されたオブジェクトより読みやすく、実際に移植性があります(JSONはどこにでも存在します)。

2018年6月更新

  • 現在、完全で更新されたドキュメントがあります here
  • json_arrayはjsonタイプを支持して廃止され、jsonフィールドの新しいデータベース機能を活用します
109

別の考慮事項:ここに示すような真/偽の値の小さなセットを表す最も効率的な方法は、 ビットフィールド です。

この方法では、完全な文字列ではなく1つの整数のみを保存します。また、エンコード/デコードのオーバーヘッドを回避できます。

良い例については、 https://stackoverflow.com/a/5412214/827254 をご覧ください。

10
Jason Hanley

前述のように、問題に対する最善の解決策は、タイプarrayまたは_json_array_の配列マッピングを使用することですが、not _simple_array_です。理由は、_simple_array_のシリアル化メソッドはimplode(',', $array)の呼び出しであり、配列のキーではなく値のみを保持するため、連想性がある状況では無効だからです。アレイ。

ただし、_$days_属性を0ベースの配列としてモデル化することもできます(つまり、mondayはゼロ、tuesdayは1など)。その場合、explode(',', $serialized);で逆シリアル化すると、シリアル化された値を持つ0ベースの配列が生成されるため、機能します。

1
Luis

ドキュメントによると:

Doctrine ORM > 基本マッピング > Doctrineマッピングタイプ

配列データを保存する3つの選択肢があります。

  1. array SQL CLOBをserialize()およびunserialize()を使用してPHP配列にマッピングする)タイプ。

  2. _simple_array_ implode()およびexplode()を使用してSQL CLOBをPHP配列にマッピングするタイプ)、区切り文字としてコンマを使用します

    重要:値に_,_を含めることができないことが確実な場合にのみ、このタイプを使用してください。

  3. _json_array_ json_encode()およびjson_decode()を使用して、SQL CLOBをPHP配列にマッピングする)型。

したがって、配列値に_,_(コンマ)が含まれないことが確実な場合は、_simple_array_を使用してください。単純な配列構造(線形)がある場合はarrayを使用し、より複雑なキー値配列がある場合は_json_array_を使用します。

0
Pmpr