2012-01-31 51 views
2

這是我想在Symfony中使用Doctrine2來實現的。Doctrine2一對多關係不起作用。 Symfony2

http://www.freeimagehosting.net/97g8z在此鏈接中,您可以找到ER模型的圖像。

所以,這些都是我的課:

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:

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 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; 
... 

此命令後:

php app/console doctrine:schema:create 

主義生成此SQL:

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); 

所以我有這些疑惑:

  • 爲什麼Doctrine2不創建引用表派斯外鍵?
  • 爲什麼Doctrine2不會創建alter table以指示表nacionalidad'idpais'和'idciudadano'上的屬性是該表的主鍵?
  • 我是否必須告訴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表是相同的。我沒有改變他們的任何東西(我不知道這是否與我遇到的問題有關)。

我做的測試是: 在告訴教條創建表格之後,我去了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)額外領域中的許多關係? – smoreno 2012-01-31 20:21:14

+1

你好,我認爲fecha是指西班牙語的生日(我是法國人,所以不太確定)。如果是的話,爲什麼不把它存儲在Ciudadano實體?然後,您可以簡化這些註釋... – greg0ire 2012-01-31 21:36:50

+0

這意味着日期,它可以是任何日期(生日是fecha de nacimiento或cumpleaños)。所以我不能將它存儲在Ciudadano,因爲它不是我想要的。不過謝謝你的幫助:)。 – 2012-02-01 13:04:41

回答

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 

我會的,但絕不是必要的,重命名這些屬性和getter/setter方法,並從中你現在的樣子,去掉「ID」從技術上來講,管理對象,而不是IDS。

希望這有助於...

+0

感謝哥們。我解決了這個問題,這就是你說的,再加上我不知道如何處理教義關係,因爲我不懂他們,而且我犯了錯誤,但我多讀了一些,沒有問題。 :) – 2012-02-07 19:36:09

+0

哦,我很傻,我什至沒看你的問題的日期。我會假設你已經解決了你的問題。很高興你有:) – 2012-02-07 19:38:27

+0

我相信你的回答會對別人有幫助;)。所以,現在還不算太晚。 – 2012-02-07 19:41:19