2012-01-31 74 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