2012-12-12 7 views
4

몇 분 전에 Doctrine2에서 오류가 발생했습니다.Doctrine2 일부 필드를 유지하지 않습니다

내 엔티티에 일부 필드를 추가 한 다음, mysql 테이블을 새로 고치고 새 데이터가 테이블에 저장되지 않은 것을 알게되었습니다.

"-> getXXX()"의 값을 var_dump 시도했는데 결과가 정확했습니다.

$user->setName($name); 
$user->setSurname($surname); 

if($country) 
    $user->setCountry($country->getId()); 

//New code 

if($province > 0) 
    $user->setProvince($province); 

if($town > 0) 
    $user->setTown($town); 

var_dump($user->getProvince(), $user->getTown()); //Works OK 

$em->persist($user); // Only persists values before Province. 
$em->flush(); 

감사의 안부 : 여기

사용되는 코드입니다!


편집

내 법인에 대한 정보 :

class Users 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="bigint") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $name 
    * 
    * @ORM\Column(name="name", type="string", length=50) 
    */ 
    private $name; 

    /** 
    * @var string $surname 
    * 
    * @ORM\Column(name="surname", type="string", length=95) 
    */ 
    private $surname; 

    /** 
    * @var string $mail 
    * 
    * @ORM\Column(name="mail", type="string", length=80, unique=true) 
    */ 
    private $mail; 

    /** 
    * @var string $password 
    * 
    * @ORM\Column(name="password", type="string", length=255) 
    */ 
    private $password; 

    /** 
    * @var $country 
    * 
    * @ORM\Column(name="country", type="integer") 
    */ 
    private $country; 

    /** 
    * @var $province 
    * 
    * @ORM\Column(name="province", type="integer") 
    */ 
    private $province; 

    /** 
    * @var $town 
    * 
    * @ORM\Column(name="town", type="integer") 
    */ 
    private $town; 
} 

나라, 지방 및 도시는 같은 이름을 가진 테이블에서의 id이다. ManytoOne association을 사용하여 필드의 유형을 변경하려고했지만 Doctrine2에서 생성 된 SQL에 오류가 발생합니다. 캐시 오류 인 것 같지만 해결할 수는 없습니다.

+2

캐시를 비우려고 했습니까? – Snroki

+0

엔티티에 대한 Doctrine 구성 (주석, yml 등)을 표시 할 수 있습니까? 새 필드에 대해 올바른 'ORM/열'을 설정 했습니까? – lifo

+0

콘솔로 메타 데이터 캐시를 지우는 것만으로는 충분하지 않습니다. 개발시 VoidCache를 사용하여 캐싱을 비활성화 할 수 있습니다.이것은 나를 도왔습니다 – sgotre

답변

0

Doctrine 연결이 작동하는 방식에 대해 많은 것을 배워야합니다. 나는 약간의 시간을내어 Doctrine mapping documentation을 통해 독서하는 것이 좋습니다.

사용자 엔티티는 이와 같은 정수를 사용하지 않아야합니다. 대신에 해당 사용자에 대해 ManyToOne 관계가 필요합니다. 즉, 각 사용자는 정확히 한 국가와 한 지역을 가질 수 있습니다. 당신은 객체 사물의 생각을 시작해야하며, 통과 않으려 주위 ID의 예를 들어

:

/** 
* @ORM\ManyToOne(targetEntity="Country") 
* @ORM\JoinColumn(name="countryId", referencedColumnName="id") 
*/ 
private $country; 

/** 
* @ORM\ManyToOne(targetEntity="Province") 
* @ORM\JoinColumn(name="provinceId", referencedColumnName="id") 
*/ 
private $province; 

그 각각의 targetEntity은 당신의 실체라고 무엇으로 변경해야합니다.

이러한 변경을 시도하면 app/console doctrine:schema:update 명령을 실행하여 스키마가 자동으로 업데이트되도록하십시오.

그런 다음 컨트롤러에서이 작업을 수행 할 수 있습니다

$country = new Country('US'); 
$entityManager->persist($country); 
$user->setCountry($country); 

참고 : 나는 setCountry() 방법으로 국가 ID를 할당하지 않았다. 실제 Country 개체를 전달합니다. 이것은 단지 예일 뿐이며 실제 컨트롤러에서는 $country 변수가 양식을 통해 전달되거나 데이터베이스 등에서 가져온 것입니다.

+0

고마워요! Docrtine2를 1 년 이상 개발 중이며 스키마 업데이트 방법을 알고 있습니다. ManyToOne 관계를 시도했지만 Doctrine2는 다음과 같은 간단한 쿼리를 작성하면 오류가 발생합니다. $ user- $ get-> getRepository ('HomeBundle : Users') -> findOneBy (array ('id'=> $ uid)); country 필드가 contruy_id (ManytoOne auto column name)로 renameb 되었기 때문에 Doctrine이 SQLSTATE [42S22] 오류를 표시했습니다. 다른 테이블에 오류가 없었기 때문에 왜이 테이블에서이 오류가 발생하는지 이해할 수 없습니다. – Mateu

+1

APC 또는 memcached 등을 사용하는 경우 아파치 프로세스를 다시 시작해보십시오 (가능한 경우). Doctrine 매핑을 업데이트 한 후 과거에 문제가 발생했습니다. Doctrine 클래스가 APC에 의해 캐시되고 유일한 수정이 APC 캐시를 지우는 API이므로 다시 SQL 오류가 발생합니다. – lifo

+1

오오 !! 감사! 그것은 해결책이었습니다! 문제는 캐시 였지만 APC를 다시 시작한다고 생각하지 않았습니다. 다시 한 번 감사드립니다! – Mateu

1

doctrine:schema:update을 사용할 때 Doctrine과 동일한 문제가있었습니다. @lifo처럼 아파치를 다시 시작해야했다. 차이점은 apc이 실행되지 않았기 때문에 Doctrine이 모델에 대한 내부 캐싱을 수행한다고 생각합니다.

$ apachectl -M | grep apc 
Syntax OK 
관련 문제