Doctrine2 Отношения один-ко-многим не работают. Symfony2 - PullRequest
2 голосов
/ 31 января 2012

Это то, чего я хочу достичь с помощью Doctrine2 в Symfony.

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;
...

Это класс Сьюдадано:

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 с идентификатором 1 существует, и я уверен, что строка в таблице ciudadano с идентификатором 1. существует.

Я получаю эту ошибку:

Предупреждение: spl_object_hash () ожидает, что параметр 1 будет объектом, строкой приведены в C: \ wamp \ www \ sym \ vendor \ doctrine \ lib \ Doctrine \ ORM \ UnitOfWork.php 1218

Я считаю, что есть проблема с аннотациями и связями. Я верю, что, возможно, я делаю не так, как должно У вас есть какие-нибудь предложения? Я ПОТЕРЯЛ.

1 Ответ

2 голосов
/ 07 февраля 2012

Я полагаю, что проблема в другом.Если вы хотите связать две сущности таким образом, вам нужно сместить всю свою логику в сторону объектов, назначая их, а не значения их первичных ключей.Об этом позаботится 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

Я бы, но ни в коем случае не обязательно, переименовывал эти атрибуты и получатели / установщики и удалял "id"из этого, как вы сейчас, технически говоря, управляете объектами, а не идентификаторами.

Надеюсь, это поможет ...

...