教义2一对多关系';它不工作了。Symfony2
这就是我想在Symfony中使用Doctrine2实现的目标 在这个链接中,您将看到ER模型的图像 这是我的课程:教义2一对多关系';它不工作了。Symfony2,symfony,doctrine-orm,one-to-many,Symfony,Doctrine Orm,One To Many,这就是我想在Symfony中使用Doctrine2实现的目标 在这个链接中,您将看到ER模型的图像 这是我的课程: class Pais { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string $nombre * * @ORM\Col
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不创建引用表Pais的外键
- 为什么Doctrine2不创建alter表来指示表nacionalidad'idpais'和'idciudadano'上的属性是该表的主键
- 我必须告诉条令作为外键的字段的类型吗?(或者说Doctrin2猜测类型?)
- 我在表格中看到的只是一对多的关系。为什么我需要多对一?我想了解
- 我没有在我的类上编写正确的注释,或者
- 我不明白这个概念
因此,我不断尝试,发现我可以通过使用此注释实现我想要的:
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\u object\u hash()要求参数1为object,string
屈服于
C:\wamp\www\sym\vendor\doctrine\lib\doctrine\ORM\UnitOfWork.php行
1218
我认为注释和关系存在问题。我相信也许我做的不是我应该做的。你有什么建议吗?我迷路了。我相信你的问题在别处。如果希望以这种方式绑定两个实体,则需要通过指定对象而不是主键值来将所有逻辑移向对象。这将由赛姆弗尼负责 也就是说,你应该:
$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
希望这有助于…你想在中间表中创建额外的多对多关系(NACOIALIDAD)吗?你好,我认为FECHA在西班牙语中意味着出生日期(我是法国人,所以不确定)。如果是,为什么不将其存储在Ciudadano实体中?然后,您可以简化这些注释……Fecha表示日期,可以是任何日期(生日是Fecha de Naciminto或Cummacrusños)。所以我不能把它储存在Ciudadano,因为这不是我想要的。不过,谢谢你的帮助:)。谢谢你,伙计。我解决了它,这就是你所说的,而且我不知道如何处理教义关系,因为我不理解它们,我犯了错误,但我读了多一点,这很好。:)哦,我真傻,我甚至没看你提问的日期。我想你已经解决了你的问题。很高兴你有:)我相信你的回答会对别人有帮助;)。所以,现在还不算太晚。