I am trying to create the form from inside the default controller. I want the values from both the dropdowns in the homepage to be stored in the ET1 and ET2 columns of the events table, which i am able to do. However i want the user_id for the logged in user should also be stored in the user_id column of the events table. While trying to do so it gives me the error:
An exception occurred while executing 'INSERT INTO events (user_id, ET1, ET2) VALUES (?, ?, ?)' with params [null, 2, 3]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null
Here is my code for defaultcontroller
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\events;
//use AppBundle\Entity\eventtype;
use AppBundle\Entity\users;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class DefaultController extends Controller {
/**
* @Route("/home", name="homepage")
*/
public function indexAction(Request $request) {
$events = new events();
$form = $this->createFormBuilder($events)
->add('eT1', ChoiceType::class, array(
'choices' => array(
'Poker' => 1,
'Chess' => 2,
'Cricket' => 3,
'Marbles' => 4,
'Football' => 5,
),
'choices_as_values' => true,
))
->add('eT2', ChoiceType::class, array(
'choices' => array(
'Poker' => 1,
'Chess' => 2,
'Cricket' => 3,
'Marbles' => 4,
'Football' => 5,
),
'choices_as_values' => true,
))
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
if ($request->isMethod('POST')) {
$form->submit($request);
if ($form->isValid()) {
// perform some action, eg. persisting the data to database...
$user = $this->container->get('security.context')->getToken()->getUser();
$id = $user->getId();
// var_dump($id);
// exit;
$events->setuserID($id);
$em = $this->getDoctrine()->getManager();
// tells Doctrine you want to (eventually) save the Product (no queries yet)
$em->persist($events);
// actually executes the queries (i.e. the INSERT query)
$em->flush();
return $this->redirectToRoute('homepage');
}
}
return $this->render('default/index.html.twig', array(
'form' => $form->createView(),
));
}
Below is the users etity
<?php
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
/**
* users
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="AppBundle\Repository\usersRepository")
*/
class users extends BaseUser
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* Get id
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @ORM\OneToMany(targetEntity="events", mappedBy="users")
*/
protected $multiEvents;
public function __construct()
{
parent::__construct();
$this->multiEvents = new ArrayCollection();
}
}
Below is the events entity
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* events
*
* @ORM\Table(name="events")
* @ORM\Entity(repositoryClass="AppBundle\Repository\eventsRepository")
*/
class events
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var int
*
* @ORM\Column(name="user_id", type="integer")
*/
protected $user_id;
/**
* @var int
*
* @ORM\Column(name="ET1", type="integer")
*/
protected $eT1;
/**
* @var int
*
* @ORM\Column(name="ET2", type="integer")
*/
protected $eT2;
/**
* @ORM\ManyToOne(targetEntity="users", inversedBy="multievents")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $singleUser;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Get user_id
*
* @return integer
*/
public function getuser_id()
{
return $this->user_id;
}
/**
* Set user_id
*
* @param integer $user_id
* @return events
*/
public function setuserID($user_id)
{
$this->user_id = $user_id;
return $this;
}
/**
* Set eT1
*
* @param integer $eT1
* @return events
*/
public function setET1($eT1)
{
$this->eT1 = $eT1;
return $this;
}
/**
* Get eT1
*
* @return integer
*/
public function getET1()
{
return $this->eT1;
}
/**
* Set eT2
*
* @param integer $eT2
* @return events
*/
public function setET2($eT2)
{
$this->eT2 = $eT2;
return $this;
}
/**
* Get eT2
*
* @return integer
*/
public function getET2()
{
return $this->eT2;
}
}
Instead of setting the
user_id
you need to set theuser
object on yourevents
.So expose the setter on the
singleUser
onevents
class (you can remove the definition of the user_id property that is already defined as relation)events
And set directly the user object in the controller:
Hope this help