【问题标题】:Doctrine2 One-to-Many Relationship's not working . Symfony2Doctrine2 一对多关系不起作用。 Symfony2
【发布时间】:2012-01-31 19:49:58
【问题描述】:

这就是我想在 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 不创建更改表来指示表 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 表是相同的。我没有改变任何东西(我不知道这是否与我遇到的问题有关)。

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

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

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

我确定表 pais 中存在 id 为 1 的行,并且我确定表 ciudadano 中存在 id 为 1 的行。

我收到此错误:

警告:spl_object_hash() 期望参数 1 是对象,字符串 给出 C:\wamp\www\sym\vendor\doctrine\lib\Doctrine\ORM\UnitOfWork.php 行 第1218章

我认为注释和关系存在问题。我相信也许我没有像应该做的那样做。你有什么建议吗?我迷路了。

【问题讨论】:

  • 您是否尝试使用中间表中的额外字段创建多对多关系 (nacionalidad)?
  • 您好,我认为 fecha 在西班牙语中的意思是生日(我是法国人,所以不确定)。如果是,为什么不将其存储在 Ciudadano 实体中?然后,您可以简化这些注释...
  • Fecha 表示日期,它可以是任何日期(生日是 fecha de nacimiento 或 cumpleaños)。所以我不能把它存放在 Ciudadano,因为这不是我想要的。不过感谢您的帮助:)。

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


【解决方案1】:

我相信你的问题出在其他地方。如果您想以这种方式绑定两个实体,您需要通过分配对象而不是它们的主键值来将所有逻辑转移到对象。这将由 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。

希望这会有所帮助...

【讨论】:

  • 谢谢哥们。我解决了它,就是你说的,加上我不知道如何处理教义关系,因为我不理解它们,而且我犯了错误,但我读了一点,还好。 :)
  • 哦,我真傻,我什至没有看你提问的日期。我会假设你已经解决了你的问题。很高兴你有:)
  • 我相信您的回答会对其他人有所帮助;)。所以,现在还为时不晚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2016-09-07
相关资源
最近更新 更多