2012-01-31 4 views
2

이것은 Symfony에서 Doctrine2를 사용하여 달성하고자하는 것입니다.Doctrine2 일대 다 관계가 작동하지 않습니다. Symfony2

http://www.freeimagehosting.net/97g8z이 링크에는 ER 모델의 이미지가 있습니다.

class Nacionalidad 
{ 

/** 
* @var integer $idpais 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Pais") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
* 
*/ 
private $idpais; 

/** 
* @var integer $idciudadano 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ciudadano") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
* 
*/ 
private $idciudadano; 

/** 
* @var date $fecha 
* 
* @ORM\Column(name="fecha", type="date") 
*/ 
private $fecha; 
... 

:

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

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

이 중간에 클래스 Nacionalidad입니다 :

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

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

이 클래스 Ciudadano입니다 :

그래서,이 내 클래스입니다 다음 명령 후 :

CREATE TABLE Ciudadano (id INT AUTO_INCREMENT NOT NULL, nombre VARCHAR(255) NOT 
NULL, apellido VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 

CREATE TABLE Nacionalidad (id INT NOT NULL, fecha DATE NOT NULL, descripcion VAR 
CHAR(255) NOT NULL, INDEX IDX_8B2C843BBF396750 (id), PRIMARY KEY(id)) ENGINE = I 
nnoDB; 

CREATE TABLE Pais (id INT AUTO_INCREMENT NOT NULL, nombre VARCHAR(255) NOT NULL, 
PRIMARY KEY(id)) ENGINE = InnoDB; 

ALTER TABLE Nacionalidad ADD CONSTRAINT FK_8B2C843BBF396750 FOREIGN KEY (id) REF 
ERENCES Ciudadano(id); 

그래서 난이 의심이 :

php app/console doctrine:schema:create 

교리는이 SQL을 생성

  • Doctrine2 테이블 파이스를 참조하는 외래 키를 생성하지 않는 이유는 무엇입니까?
  • 왜 nctionalidad 'idpais'및 'idciudadano'테이블의 속성이 해당 테이블의 기본 키임을 나타내려면 Doctrine2가 alter table을 생성하지 않습니다?
  • Doctrine에 외래 키인 필드의 유형을 알려야합니까? (또는 Doctrine2가 타입을 추측합니까?)
  • 테이블에 나타나는 것은 일대 다 관계입니다. 왜 다 대일이 필요한가요? 나는 이해하고 싶다.

이 부분에 도움이 필요합니다. 미정 :

  • 나는 내 수업에 적절한 주석을 쓰고 있지 않다, 또는
  • 나는 개념을받지 못했습니다.

그래서 나는 오려고 내가이 주석을 사용하여 내가 원하는 것을 달성 할 수 있음을 발견

class Nacionalidad 
{ 

/** 
* @var integer $idpais 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Pais", inversedBy="Nacionalidad") 
* @ORM\JoinColumn(name="idpais", referencedColumnName="id") 
* 
*/ 
private $idpais; 

/** 
* @var integer $idciudadano 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ciudadano", inversedBy="Nacionalidad") 
* @ORM\JoinColumn(name="idciudadano", referencedColumnName="id") 
* 
*/ 
private $idciudadano; 

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

파이스와 Ciudadano 테이블이 동일합니다. 나는 그들 안에 아무 것도 바꾸지 않았다. (나는 이것이 내가 가진 문제와 관련이 있는지 모른다.)

내가 한 테스트는 다음과 같습니다. doctrine에 테이블을 생성하라고 말한 후 필자는 phpmyadmin에 가서 테이블과 관계가 내가 원하는 것임을 확인했습니다. 그리고 그들은 그렇습니다. 그러나 :

내가 Nacionalidad에 행 삽입하기 위해 노력하고있어 :

$nacionalidad->setidpais('1'); 
$nacionalidad->setidciudadano('1'); 
$nacionalidad->setfecha('1989-02-01'); 
$nacionalidad->setdescripcion('Hola'); 

내가 ID 1이있는 테이블의 파이스의 행 확신을, 나는 ID로 테이블 ciudadano의 행 확신 1이 존재합니다.내가 주석과의 관계에 문제가있는 생각

Warning: spl_object_hash() expects parameter 1 to be object, string given in C:\wamp\www\sym\vendor\doctrine\lib\Doctrine\ORM\UnitOfWork.php line 1218

:

는이 오류를 받고 있어요. 나는 그것이해야하는 것처럼 나는 아마 그것을하지 않을 것이라고 생각한다. 의견 있으십니까? 나는 잃어 버렸다.

+0

중간 테이블 (nacionalidad)의 추가 입력란을 사용하여 many to many 관계를 만들려고하십니까? – smoreno

+1

안녕하세요, 나는 fecha가 스페인어로 생년월일을 의미한다고 생각합니다 (저는 프랑스 인이므로 확실하지 않습니다). 그렇다면 Ciudadano 엔티티에 저장하지 않으시겠습니까? 그런 다음이 주석을 단순화 할 수 있습니다. – greg0ire

+0

Fecha는 날짜를 의미합니다. 날짜는 생일이 될 수 있습니다 (생일은 fecha de nacimiento 또는 cumpleaños 임). 그래서 나는 그것이 내가 원하는 것이 아니기 때문에 Ciudadano에 그것을 저장할 수 없다. 그러나 도와 줘서 고마워. :). –

답변

2

나는 당신이 문제가 다른 곳에 있다고 믿습니다. 두 엔티티를 그런 방식으로 바인딩하려면 논리를 기본 키 값이 아닌 객체를 지정하여 객체로 이동해야합니다. 그것은 Symfony가 처리 할 것입니다.

당신이해야한다고 말했다되고 그건 :

$pais = ... // either create new Pais object or retrieve it from db 
$ciudadano = ... // same as above 
$date = DateTime::createFromFormat('Y-m-d', '1989-02-0'); // no Date class in PHP, but I think this will work... 

$nacionalidad->setidpais($paid); 
$nacionalidad->setidciudadano($ciudadano); 
$nacionalidad->setfecha($date); 
$nacionalidad->setdescripcion('Hola'); // this is *simple* type so this can go like this 

나는 것,하지만 수단이 필요하지 않습니다에 의해 그 특성 및 게터/세터의 이름을 변경하고, 지금 그것을에서 "ID"를 제거 기술적으로 말하기, 관리 객체가 아니라 객체입니다.

희망이 있습니다 ...

+0

고마워요. 나는 그것을 풀어 냈습니다. 그것은 당신이 말한 것이 었습니다. 게다가 교리 관계를 이해하지 못했고 실수를하고 있었기 때문에 교리 관계를 다루는 법을 알지 못했지만 조금 더 읽었습니다. :) –

+0

어리석은 나, 나는 심지어 당신의 질문의 날짜를 보지 않았다. 나는 당신이 당신의 문제를 해결했다고 가정합니다. 다행 스럽네요 :) –

+0

당신의 대답은 다른 사람들에게 도움이 될 것이라고 확신합니다;). 너무 늦지 않았습니다. –

관련 문제