Doctrine 将外键插入为 NULL
Doctrine insert foreign key as NULL
我有两个实体:Profesiones
和 ProfesionesTranslation
(一个 Profesiones 有很多 ProfesionesTranslation)。当我尝试插入一组数据时,但原则将我的外键插入为 NULL。我想映射可能是错误的。
专业实体:
class Profesiones
{
use ORMBehaviors\Translatable\Translatable;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="profesiones_id_profesion_seq", allocationSize=1, initialValue=1)
*/
private $idProfesion;
/**
* @var boolean
*
* @ORM\Column(name="activo", type="boolean", nullable=true)
* @Assert\NotBlank(message="Campo Obligatorio.")
*/
private $activo;
/**
* @var \SubgrupoServicios
*
* @ORM\ManyToOne(targetEntity="SubgrupoServicios")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_subgrupo", referencedColumnName="id_subgrupo")
* })
*/
private $idSubgrupo;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Empresas", mappedBy="idProfesion")
*/
private $idEmpresa;
/**
* Constructor
*/
public function __construct()
{
$this->idEmpresa = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
/**
* Get id
*
* @return integer
*/
public function getIdProfesion()
{
return $this->idProfesion;
}
/**
* Set activo
*
* @param boolean $activo
* @return Profesiones
*/
public function setActivo($activo)
{
$this->activo = $activo;
return $this;
}
/**
* Get activo
*
* @return boolean
*/
public function getActivo()
{
return $this->activo;
}
/**
* Set idSubgrupo
*
* @param \Sistema\FilmsBundle\Entity\SubgrupoServicios $idSubgrupo
* @return Profesiones
*/
public function setIdSubgrupo(\Sistema\FilmsBundle\Entity\SubgrupoServicios $idSubgrupo = null)
{
$this->idSubgrupo = $idSubgrupo;
return $this;
}
/**
* Get idSubgrupo
*
* @return \Sistema\FilmsBundle\Entity\SubgrupoServicios
*/
public function getIdSubgrupo()
{
return $this->idSubgrupo;
}
/**
* Add idEmpresa
*
* @param \Sistema\FilmsBundle\Entity\Empresas $idEmpresa
* @return Profesiones
*/
public function addIdEmpresa(\Sistema\FilmsBundle\Entity\Empresas $idEmpresa)
{
$this->idEmpresa[] = $idEmpresa;
return $this;
}
/**
* Remove idEmpresa
*
* @param \Sistema\FilmsBundle\Entity\Empresas $idEmpresa
*/
public function removeIdEmpresa(\Sistema\FilmsBundle\Entity\Empresas $idEmpresa)
{
$this->idEmpresa->removeElement($idEmpresa);
}
/**
* Get idEmpresa
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getIdEmpresa()
{
return $this->idEmpresa;
}
}
专业翻译实体:
class ProfesionesTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @var integer
*
* @ORM\Column(name="translatable_id", type="integer", nullable=false)
*/
public $translatableId;
/**
* @var string
*
* @ORM\Column(name="profesion", type="string", length=100, nullable=true)
* @Assert\NotBlank(message="Campo Obligatorio.")
*/
private $profesion;
/**
* Set translatableId
*
* @param integer $translatableId
* @return ProfesionesTranslation
*/
public function setTranslatableId($translatableId)
{
$this->translatableId = $translatableId;
return $this;
}
/**
* Get translatableId
*
* @return integer
*/
public function getTranslatableId()
{
return $this->translatableId;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set profesion
*
* @param string $profesion
* @return ProfesionesTranslation
*/
public function setProfesion($profesion)
{
$this->profesion = $profesion;
return $this;
}
/**
* Get profesion
*
* @return string
*/
public function getProfesion()
{
return $this->profesion;
}
public function __toString()
{
return $this->getProfesion();
}
}
控制器:
$servicio = new Profesiones();
$formulario = $this->createForm(new ServiciosType(), $servicio);
if($peticion->getMethod() =='POST'){
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($servicio);
$em->flush();
$profesionesTranslation = new ProfesionesTranslation();
$locale = 'es';
$profesion = $formulario['profesion']->getData();
$translatableId = $servicio->getIdProfesion();
$profesionesTranslation->setLocale($locale);
$profesionesTranslation->setProfesion($profesion);
$profesionesTranslation->setTranslatableId($translatableId);
$em->persist($profesionesTranslation);
$em->flush();
...
非常感谢任何帮助。
我假设您正在使用 KnpLabs DoctrineBehaviors translatable:documentation
根据文档,您不应直接管理 ProfesionesTranslation 实体,而应通过 Profesiones 实体进行管理。
更改控制器中的代码:
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$profesion = $formulario['profesion']->getData();
$locale = 'es';
$servicio->translate($locale)->setProfesion($profesion);
$em->persist($servicio);
// In order to persist new translations, call mergeNewTranslations method, before flush
$servicio->mergeNewTranslations();
$em->flush();
从 ProfesionesTranslation 中删除 $translatableId
,不需要。 (不要忘记更新学说模式)
要获得翻译,请使用:
$profecion = $servicio->translate('es')->getProfesion();
使用 "translate()" method, I will not get into many detail on how it works, if you need you can check the KnpLabs repo.
创建、设置或获取翻译实体
我有两个实体:Profesiones
和 ProfesionesTranslation
(一个 Profesiones 有很多 ProfesionesTranslation)。当我尝试插入一组数据时,但原则将我的外键插入为 NULL。我想映射可能是错误的。
专业实体:
class Profesiones
{
use ORMBehaviors\Translatable\Translatable;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="profesiones_id_profesion_seq", allocationSize=1, initialValue=1)
*/
private $idProfesion;
/**
* @var boolean
*
* @ORM\Column(name="activo", type="boolean", nullable=true)
* @Assert\NotBlank(message="Campo Obligatorio.")
*/
private $activo;
/**
* @var \SubgrupoServicios
*
* @ORM\ManyToOne(targetEntity="SubgrupoServicios")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_subgrupo", referencedColumnName="id_subgrupo")
* })
*/
private $idSubgrupo;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Empresas", mappedBy="idProfesion")
*/
private $idEmpresa;
/**
* Constructor
*/
public function __construct()
{
$this->idEmpresa = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
/**
* Get id
*
* @return integer
*/
public function getIdProfesion()
{
return $this->idProfesion;
}
/**
* Set activo
*
* @param boolean $activo
* @return Profesiones
*/
public function setActivo($activo)
{
$this->activo = $activo;
return $this;
}
/**
* Get activo
*
* @return boolean
*/
public function getActivo()
{
return $this->activo;
}
/**
* Set idSubgrupo
*
* @param \Sistema\FilmsBundle\Entity\SubgrupoServicios $idSubgrupo
* @return Profesiones
*/
public function setIdSubgrupo(\Sistema\FilmsBundle\Entity\SubgrupoServicios $idSubgrupo = null)
{
$this->idSubgrupo = $idSubgrupo;
return $this;
}
/**
* Get idSubgrupo
*
* @return \Sistema\FilmsBundle\Entity\SubgrupoServicios
*/
public function getIdSubgrupo()
{
return $this->idSubgrupo;
}
/**
* Add idEmpresa
*
* @param \Sistema\FilmsBundle\Entity\Empresas $idEmpresa
* @return Profesiones
*/
public function addIdEmpresa(\Sistema\FilmsBundle\Entity\Empresas $idEmpresa)
{
$this->idEmpresa[] = $idEmpresa;
return $this;
}
/**
* Remove idEmpresa
*
* @param \Sistema\FilmsBundle\Entity\Empresas $idEmpresa
*/
public function removeIdEmpresa(\Sistema\FilmsBundle\Entity\Empresas $idEmpresa)
{
$this->idEmpresa->removeElement($idEmpresa);
}
/**
* Get idEmpresa
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getIdEmpresa()
{
return $this->idEmpresa;
}
}
专业翻译实体:
class ProfesionesTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @var integer
*
* @ORM\Column(name="translatable_id", type="integer", nullable=false)
*/
public $translatableId;
/**
* @var string
*
* @ORM\Column(name="profesion", type="string", length=100, nullable=true)
* @Assert\NotBlank(message="Campo Obligatorio.")
*/
private $profesion;
/**
* Set translatableId
*
* @param integer $translatableId
* @return ProfesionesTranslation
*/
public function setTranslatableId($translatableId)
{
$this->translatableId = $translatableId;
return $this;
}
/**
* Get translatableId
*
* @return integer
*/
public function getTranslatableId()
{
return $this->translatableId;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set profesion
*
* @param string $profesion
* @return ProfesionesTranslation
*/
public function setProfesion($profesion)
{
$this->profesion = $profesion;
return $this;
}
/**
* Get profesion
*
* @return string
*/
public function getProfesion()
{
return $this->profesion;
}
public function __toString()
{
return $this->getProfesion();
}
}
控制器:
$servicio = new Profesiones();
$formulario = $this->createForm(new ServiciosType(), $servicio);
if($peticion->getMethod() =='POST'){
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($servicio);
$em->flush();
$profesionesTranslation = new ProfesionesTranslation();
$locale = 'es';
$profesion = $formulario['profesion']->getData();
$translatableId = $servicio->getIdProfesion();
$profesionesTranslation->setLocale($locale);
$profesionesTranslation->setProfesion($profesion);
$profesionesTranslation->setTranslatableId($translatableId);
$em->persist($profesionesTranslation);
$em->flush();
...
非常感谢任何帮助。
我假设您正在使用 KnpLabs DoctrineBehaviors translatable:documentation
根据文档,您不应直接管理 ProfesionesTranslation 实体,而应通过 Profesiones 实体进行管理。
更改控制器中的代码:
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$profesion = $formulario['profesion']->getData();
$locale = 'es';
$servicio->translate($locale)->setProfesion($profesion);
$em->persist($servicio);
// In order to persist new translations, call mergeNewTranslations method, before flush
$servicio->mergeNewTranslations();
$em->flush();
从 ProfesionesTranslation 中删除 $translatableId
,不需要。 (不要忘记更新学说模式)
要获得翻译,请使用:
$profecion = $servicio->translate('es')->getProfesion();
使用 "translate()" method, I will not get into many detail on how it works, if you need you can check the KnpLabs repo.
创建、设置或获取翻译实体