Here is an entity (EDITED: full file content)
// Eve\MoonBundle\Entity\MoonMaterial.php
namespace Eve\MoonBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
//use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Table(name="_moon_material")
* @ORM\Entity()
*/
class MoonMaterial
{
public function __construct()
{
//$this->invTypes_byTypeID = new ArrayCollection();
}
// relations start
/**
* @ORM\OneToOne(targetEntity="Eve\DumpBundle\Entity\invTypes")
* @ORM\JoinColumn(name="typeID", referencedColumnName="typeID")
*/
private $invTypes_byTypeID;
public function get_invTypes_byTypeID()
{
return $this->invTypes_byTypeID;
}
// relations end
/**
* @ORM\Column(name="userID", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $userID;
/**
* @ORM\Column(name="moonID", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $moonID;
/**
* @ORM\Column(name="typeID", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $typeID;
/**
* Set userID
*
* @param integer $userID
* @return MoonMaterial
*/
public function setUserID($userID)
{
$this->userID = $userID;
return $this;
}
/**
* Get userID
*
* @return integer
*/
public function getUserID()
{
return $this->userID;
}
/**
* Set moonID
*
* @param integer $moonID
* @return MoonMaterial
*/
public function setMoonID($moonID)
{
$this->moonID = $moonID;
return $this;
}
/**
* Get moonID
*
* @return integer
*/
public function getMoonID()
{
return $this->moonID;
}
/**
* Set typeID
*
* @param integer $typeID
* @return MoonMaterial
*/
public function setTypeID($typeID)
{
$this->typeID = $typeID;
return $this;
}
/**
* Get typeID
*
* @return integer
*/
public function getTypeID()
{
return $this->typeID;
}
}
code in controller (EDITED)
// Eve\MoonBundle\Controller\IndexController.php
namespace Eve\MoonBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Eve\MoonBundle\Entity\MoonMaterial;
class IndexController extends Controller
{
public function defaultAction($moonName)
{
// ...
$dc = $this->getDoctrine();
$form = $this
->createFormBuilder()
->add('typeID', 'choice', $choiceSettings)
->getForm();
if ($this->getRequest()->isMethod('post'))
{
$form->bind($this->getRequest());
{
$data = $form->getData();
$typeID = $data['typeID'];
if (is_int($typeID))
{
$em = $dc->getEntityManager();
$mm = $em->getRepository('EveMoonBundle:MoonMaterial');
$result = $mm->findOneBy(array(
'userID' => $this->getUser()->getID(),
'typeID' => $typeID,
'moonID' => $moon->getItemID()));
if ($result)
{
$em->remove($result);
$em->flush();
}
$moonMaterial = new MoonMaterial();
$moonMaterial
->setUserID($this->getUser()->getID())
->setTypeID($typeID)
->setMoonID($moon->getItemID());
$em->persist($moonMaterial);
$em->flush();
}
}
}
$twig = 'EveMoonBundle:Index:default.html.twig';
return $this->render($twig, array(
'formAddMoonMaterial' => $form->createView()));
}
}
when i try this, i get error
An exception occurred while executing 'INSERT INTO _moon_material (userID, moonID, typeID) VALUES (?, ?, ?)' with params {"1":38,"2":40001583,"3":null}:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'typeID' cannot be null
but when i comment the OneToOne (code above) relationship it work correctly, so main trouble is in description OneToOne relationship... pls help to deal with it
what i want, i want rewrite entry if exist in table "_moon_material" or simply write it if not
ps: i need that relation only for "read" (join name by id)
If you want to allow null values set
to
and you should let the column 'typeID' to be nullable also. (see How do I modify a MySQL column to allow NULL?)
If you don't want to have NULL's, just do the opposite.
i don't know why, i can't do unidirectional relations, so i solved it by bidirectional by adding some code to invTypes table annotation
Both
$invTypes_byTypeID
and$typeID
properties maps to the sametypeID
column. You can't do this with doctrine.I suggest that you remove the
$typeID
property, and instead of working with a 'type id', you work with the type instance and set it to the$invTypes_byTypeID
property.I guess that it would mean changing you form etc ...
I'd check the method setTypeID() in your entity, it's likely that this isn't setting the property as you're expecting, hence the null.