2012-07-16 1 views
0

symfony2 응용 프로그램에 WebSite 속성이있는 Job 엔티티가 있습니다.symfony/Doctrine : 지속 가능한 경우 클래스 <type>의 객체를 문자열로 변환 할 수 없습니다.

다른 속성이나 방법없이 본의 단순화 된 표현 :

/** 
* @ORM\Entity 
* @ORM\Table(name="Job") 
*/ 
class Job 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 


    /** 
    * @ORM\Column(type="integer", name="website_id", nullable=false) 
    * @ORM\ManyToOne(targetEntity="Example\ExampleBundle\Entity\WebSite") 
    */ 
    protected $website; 
} 

심포니/교리 오류의 결과로 지속 할 때 문자열로 website 속성을 전송하려고 :

Catchable Fatal Error: Object of class Example\ExampleBundle\Entity\WebSite could not be converted to string in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 131

I 위의 @ORM \ Column 주석은 website 속성이 정수임을 나타냅니다. Symfony/Doctrine이 website 속성을 문자열로 변환하려고 시도하는 이유를 이해할 수 없습니다.

비 이상적인 해결 방법은 내가이 문제 해결을 시도 시도 :

  • __toString() 방법 WebSite에 추가하기 id 재산의 문자열 표현을 반환을, 궁극적으로 끝날 수있는 올바른 값을 발생 Job.website_id 데이터 필드; 나중에이 응용 프로그램의 다른 곳에 문자열을 표시하려면 __toString()이 필요하므로이 해결 방법은 실용적이지 않습니다.

  • website 속성에서 @ORM\Column 주석을 제거합니다. 이것은 미래의 모든 diff 생성 마이 그 레이션 (php app/console doctrine : migrations : diff)에서 관련 데이터베이스 필드의 'not null'부분을 제거합니다.

은 변경 내가 심포니/교리가 지속 할 때 필요한 것을 얻을 WebSitegetId() 메소드를 호출 알리기 위해 위의 주석에 존재해야 있습니까? 동일한 결과를 얻기 위해 WebSite을 변경할 수 있습니까?

Doctrine이 궁극적으로 WebSite.getId()을 호출하여 개체를 문자열로 캐스팅하지 않고 지속될 때 필요한 것을 얻을 수 있도록하기 위해 위의 주석을 그대로 유지하려면 어떤 변경이 필요합니까?

답변

6

$website 속성에서 @ORM\Column(type="integer" 주석을 제거해야합니다.

website_id 열이 NOT NULL 제약 조건을 유지하는지 확인하려면에 nullable=false으로 JoinColumn 주석을 추가 : 당신이 당신의 주석에서 전체 @ORM의 \ 열 속성을 제거해야

/** 
* @var Example\ExampleBundle\Entity\WebSite 
* 
* @ORM\ManyToOne(targetEntity="Example\ExampleBundle\Entity\WebSite") 
* @ORM\JoinColumn(name="website_id", referencedColumnName="id", nullable=false) 
*/ 
protected $website; 
+0

참고! – nepda