Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
教义2一对多关系';它不工作了。Symfony2_Symfony_Doctrine Orm_One To Many - Fatal编程技术网

教义2一对多关系';它不工作了。Symfony2

教义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

这就是我想在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\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,因为这不是我想要的。不过,谢谢你的帮助:)。谢谢你,伙计。我解决了它,这就是你所说的,而且我不知道如何处理教义关系,因为我不理解它们,我犯了错误,但我读了多一点,这很好。:)哦,我真傻,我甚至没看你提问的日期。我想你已经解决了你的问题。很高兴你有:)我相信你的回答会对别人有帮助;)。所以,现在还不算太晚。