Doctrine2一对多关系不起作用。 Symfony2的

时间:2012-01-31 19:49:59

标签: symfony doctrine-orm one-to-many

这是我想在Symfony中使用Doctrine2实现的目标。

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

Doctrine生成此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不会创建引用表Pais的外键?
  • 为什么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;

Pais和Ciudadano表是一样的。我没有改变任何东西(我不知道这是否与我的问题有关)。

我做的测试是: 在告诉doctrine创建表之后,我去了phpmyadmin并确认表和关系是我想要的。是的,他们是。但是:

我正在尝试在Nacionalidad上插入一行:

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

我确定表id中有一行id为1,我确定表ciudadano中有一行,id为1。

我收到了这个错误:

  

警告:spl_object_hash()期望参数1为object,string   给定的   C:\ wamp \ www \ sym \ vendor \ doctrine \ lib \ Doctrine \ ORM \ UnitOfWork.php line   1218

我认为注释和关系存在问题。我相信也许我不应该这样做。你有什么建议吗?我很失落。

1 个答案:

答案 0 :(得分: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”,从技术上讲,管理对象,而不是ID。

希望这会有所帮助......