Обновление 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;
}
Доктрина не связывает автоматически два объекта, но сохраняет их одновременно упорствовать. Это должно работать:
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();
}
Других решений пока нет …