2016-06-03 4 views
4

PostgreSQL 데이터베이스에서 Doctrine ORM의 ArrayCollection을 사용하여 이상한 일들을 발견했습니다 (Symfony 3 프로젝트에서 이것을 사용함).PostgreSQL의 Doctrine ORM ArrayCollection

역할이있는 내 User 클래스를 가져 오려면 기본 역할 ROLE_USER으로 시작되며 array이어야합니다.

class User implements UserInterface, Serializable 
{ 
    /** 
    * @var ArrayCollection 
    * 
    * @ORM\Column(name="roles", type="array") 
    */ 
    private $roles; 

    public function __construct() 
    { 
     $this->roles = new ArrayCollection(); 
     $this->roles->add('ROLE_USER'); 
    } 
} 

이것은 다음과 같이 데이터베이스에 저장됩니다. ArrayCollection의 명확 부분은 데이터베이스에 누락되어 있기 때문에 User으로 로그온을 시도 할 때 Serialization 오류를 줄 것이다

O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:53:"

.

해결책을 찾기 위해 Google에서 this Github issue을 발견했습니다. 내가 이해하기에 이것은 버그이며 을 PostgreSQL 환경에서 사용할 수 없습니다.

@ORM\Column 태그의 유형을 정의하지 않으면 도움이되지 않지만 데이터베이스에 다음을 저장하고 Symfony은 역할을 검색하는 데 사용할 수 없습니다. Doctrine\Common\Collections\[email protected] 그리고 모두가 그래서 객체를 반환하지 않는 유형으로 simple_array 또는 json를 사용하여없는 이동의

사람이에 대한 해결 방법 또는 솔루션이 있습니까? 나는 정말 후회하기 시작했다 MySQL에서 PostgreSQL

참고 : 코드는 MySQL에서 정상적으로 작동하고 있었고 데이터베이스를 전환했다.

+0

json으로 일반적으로 데이터베이스에 어떤 모습까요? 전체 문자열을 의미합니다. –

답변

0

ArrayCollection 속성에 대해 고유 한 매핑 유형을 항상 만들 수 있습니다. Doctrine DBAL docsORM cookbook은 하나를 만드는 법을 설명합니다. Symfony documentation은 활성화/등록하는 방법을 설명합니다. PHP 값으로 변환 할 때

json_encode($value->toArray()) 

그리고 JSON - 디코딩과의 ArrayCollection에 다시 포장 : 당신은 DB 값으로 변환 할 때 예를 들어, 배열 및 JSON 인코딩을 추출 할 수

new ArrayCollection(json_decode($value)) 

그러나, 당신은 : 당신이 원하는 무엇이든 할 수있는 매핑 유형의

0

나 자신도이 문제가 있었는데 postgresql이 직렬화 된 문자열을 잘라내는 이유를 모르겠다. 심지어 필드가 텍스트로 표시되어있다. 내 제안은 열 유형을 json_array로 바꾸는 것입니다. 왜냐하면 postgresql은 네이티브 타입을 가지고 있기 때문입니다. 또는 사용자 정의 유형을 사용할 수도 있습니다.

관련 문제