Ассоциация ManyToOne ORM в Doctrine с пользовательским именем JoinColumn

Обновление 01.09.2016 Я обновил свой проект: я избавился от пользовательского JoinColumn в моих сущностях (теперь он сгенерирован, и мой проект работает без ошибок). И я решил сократить вопрос:

Является ли хорошей идеей использовать пользовательское имя JoinColumn в однонаправленной ассоциации ManyToOne с Symfony 2.7, Doctrine 2.7?

Мой случай был:


Много сущности ipGroup (содержит много IP-адресов) должен быть связан с Один сущность ipGroupPrameters. (см код ниже)


Я пытаюсь запустить код в 3 вариантах (см. «Рабочий процесс») и получаю разные ошибки:

1). Нет ошибок, но только заполнение ipGroupParams Таблица БД и не вставляя ни одной строки в ipGroup Таблица;

2). «Примечание: неопределенный индекс: ipGroupId» в вендоре / doctrine / orm / lib / Doctrine / ORM / Persisters / BasicEntityPersister.php в строке 685

$value = $newValId[$targetClass->fieldNames[$targetColumn]];

что действительно странно — $ targetClass имеет ipGroupId в fieldNames (как показывает отладчик);

3). (в этом варианте похоже, что я меняю владеющим сторона отношений) Исключение DBAL: возникла исключительная ситуация при выполнении ‘INSERT INTO ipGroup (ipGroupId, ip) VALUES (?,?)’ С параметрами [null, «134.17.26.129»] ipGroupId не может быть пустым.
И это волшебство, потому что я применяю метод setIpGroupId к $ gObj, и он обновляется в оперативной памяти (я вижу это в отладчике).

Workflow является:

public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
### 1 variant
$gObj->setIpGroupParams($this->paramsObj);
### 2 variant
$gObj->setIpGroupParams($this->paramsObj);
$this->em->persist($gObj); // if not rely on cascade persist
### 3 variant
$this->paramsObj->addIpGroup($gObj);
$this->em->persist($this->paramsObj);
###
$this->em->flush();
}
public function createParamsObj()
{
$pObj = new \Bmw\StatBundle\Entity\ipGroupParams();
$this->groupId = $this->container->get('my.id.generator')->generate();
$pObj->setIpGroupId($this->groupId);
$this->em->persist($pObj);
$this->em->flush();
$this->paramsObj = $pObj;
}

Вот начальный юридические лица код, — тогда я бегу Doc: генераторные: юридические лица для автоматического создания геттеров и сеттеров:

/**
* ipGroup
*
* @ORM\Table(
* uniqueConstraints={
* @UniqueConstraint(name="ip", columns={"ip"}),
* @UniqueConstraint(name="userId", columns={"userId"}),
* },
* indexes={@Index(name="ipGroupId", columns={"ipGroupId"})},
* )
* @ORM\Entity
*/
class ipGroup
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var integer
*
* @ORM\Column(name="ipGroupId", type="integer")
*/
private $ipGroupId;

/**
* @ORM\ManyToOne(targetEntity="ipGroupParams", inversedBy="ipGroup")
* @ORM\JoinColumn(name="ipGroupId", referencedColumnName="ipGroupId")
*/
private $ipGroupParams;

/**
* @var string
*
* @ORM\Column(name="ip", type="string", length=45, nullable=true)
*/
private $ip;
}

/**
* ipGroupParams
*
* @ORM\Table(
* uniqueConstraints={
* @UniqueConstraint(name="ipGroupId", columns={"ipGroupId"}),
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class ipGroupParams
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;/**
* @ORM\OneToMany(targetEntity="ipGroup", mappedBy="ipGroupParams", cascade={"persist", "remove"}, orphanRemoval=TRUE)
*/
private $ipGroup;

/**
* @var integer
*
* @ORM\Column(name="ipGroupId", type="integer")
*/
private $ipGroupId;
}

1

Решение

Доктрина не связывает автоматически два объекта, но сохраняет их одновременно упорствовать. Это должно работать:

public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
$gObj->setIpGroupParams($this->paramsObj);

$this->paramsObj->addIpGroup($gObj);

$this->em->persist($gObj);
$this->em->flush();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]