这是我想在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
我相信这是与注释和关系的问题。我相信也许我没有做它应该做的事情。你有什么建议吗?我迷路了。
你想创建许多在中间表(nacionalidad)额外领域中的许多关系? – smoreno 2012-01-31 20:21:14
你好,我认为fecha是指西班牙语的生日(我是法国人,所以不太确定)。如果是的话,为什么不把它存储在Ciudadano实体?然后,您可以简化这些注释... – greg0ire 2012-01-31 21:36:50
这意味着日期,它可以是任何日期(生日是fecha de nacimiento或cumpleaños)。所以我不能将它存储在Ciudadano,因为它不是我想要的。不过谢谢你的帮助:)。 – 2012-02-01 13:04:41