programing

교리 배열 대 simple_array 대 json_array

projobs 2021. 1. 18. 07:28
반응형

교리 배열 대 simple_array 대 json_array


심포니와 교리를 ORM으로 사용합니다. 사용 가능한 유형에는 array , simple_array 또는 json_array 가 있습니다. 각각의 차이점은 무엇입니까? 그리고 둘 중 하나를 언제 사용합니까? 차이점을 설명하기 위해 각각에 대한 쇼케이스가 있습니까?

이미 일부 응용 프로그램에서 simple_array를 사용했지만 formType에서 제대로 렌더링되지 않는 것으로 나타났습니다 ... (아니면 잘 사용하지 않을 수도 있습니다!?)

내 질문을 설명하기 위해 다음은 쇼 케이스입니다.

특정 요일에 실행해야하는 작업이 있으므로 days 속성으로 TaskEntity만들었습니다.

날짜는 다음과 같습니다.

$days = array(
    1=>true,
    2=>true,
    3=>true,
    4=>true,
    5=>true,
    6=>false,
    7=>false
);

그러나 나는 마녀 유형을 선택할지 모른다 ...


문제 simple_array가 올바른 방법이기 때문에 올바른 방법으로 7 개의 부울 필드를 만들 수도 있습니다.

그러나 여기에 약간의 vademecum이 있습니다.

유형이 교리에서 어떻게 작동하는지 확인하는 가장 좋은 방법은 유형의 코드를 읽는 것입니다. 이는 당연한 것으로 간주되거나 문서에 실제로 설명되지 않은 몇 가지 세부 사항이 있기 때문입니다.

그래서 당신은 들어갈 수 있습니다

/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를 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 월 업데이트

  • 이제 여기에 완전하고 업데이트 된 문서가 있습니다.
  • json_array는 json 유형을 위해 더 이상 사용되지 않으며 json 필드에 대한 새로운 데이터베이스 기능을 활용합니다.

또 다른 고려 사항 : 여기에 제시된 것과 같은 참 / 거짓 값의 작은 집합을 나타내는 가장 효율적인 방법은 bitfield 입니다.

그런 식으로 전체 문자열 대신 하나의 정수만 저장합니다. 그리고 인코딩 / 디코딩 오버 헤드를 피할 수 있습니다.

좋은 예는 https://stackoverflow.com/a/5412214/827254참조 하십시오 .


당신의 문제에 대한 가장 좋은 방법은, 언급 한 바와 같이, 유형의 배열 매핑 사용하는 것 array또는 json_array하지만 하지 simple_array . 그 이유는의 직렬화 방법이 simple_array호출 일 implode(',', $array)뿐이며 배열의 키가 아닌 값만 유지하므로 연관 배열이있는 상황에서는 유효하지 않기 때문입니다.

그러나 $days속성을 0 기반 배열로 모델링 할 수도 있습니다 (예 : 월요일은 0, 화요일은 1 등). 이 경우 역 직렬화가 explode(',', $serialized);직렬화 된 값으로 0 기반 배열을 생성 하기 때문에 작동 합니다.


문서에 따르면 :

교리 ORM > 기본 매핑 > 교리 매핑 유형

어레이 데이터를 재지 정하는 3 가지 선택 사항이 있습니다.

  1. array Type that maps a SQL CLOB to a PHP array using serialize() and unserialize().

  2. simple_array Type that maps a SQL CLOB to a PHP array using implode() and explode(), with a comma as delimiter.

    IMPORTANT: Only use this type if you are sure that your values cannot contain a ,.

  3. json_array Type that maps a SQL CLOB to a PHP array using json_encode() and json_decode().

So, if you are sure about not having , (comma) in your array values, use simple_array. If you have a simple array structure (linear), use array and if you have more complex key-value arrays, use json_array.

ReferenceURL : https://stackoverflow.com/questions/16587769/doctrine-array-vs-simple-array-vs-json-array

반응형