I explain my situation :
I have two entities, one is called "User" handle by fosuserBundle and another called "Article". I'll wish when I create a new Article the foreign key "fosUserId" be persisted too.
Here is my User entity :
<?php
namespace AppBundle\Entity;
use ArticleBundle\Entity\Article;
use Doctrine\Common\Collections\ArrayCollection;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\OneToMany(targetEntity="ArticleBundle\Entity\Article", mappedBy="fosUserId")
*/
private $articles;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
$this->articles = new ArrayCollection();
}
/**
* Set $articles
*
*@Param array $articles
*
* Return User
*/
public function setArticles($articles)
{
$this->articles = $articles;
}
/**
* Get articles
*
* @return array
*/
public function getArticles()
{
return array('articles' => $this->articles);
}
/**
* Add article
*
* @param \ArticleBundle\Entity\Article $article
*
* @return User
*/
public function addArticle(\ArticleBundle\Entity\Article $article)
{
$this->articles[] = $article;
return $this;
}
/**
* Remove article
*
* @param \ArticleBundle\Entity\Article $article
*/
public function removeArticle(\ArticleBundle\Entity\Article $article)
{
$this->articles->removeElement($article);
}
}
Here is my Article entity :
<?php
namespace ArticleBundle\Entity;
use AppBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
/**
* Article
*
* @ORM\Table(name="article")
* @ORM\Entity(repositoryClass="ArticleBundle\Repository\ArticleRepository")
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="articles", cascade={"persist"})
* @ORM\JoinColumn(name="fosUserId", referencedColumnName="id")
*/
private $fosUserId;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="category", type="string", length=255)
*/
private $category;
/**
* @var string
*
* @ORM\Column(name="brand", type="string", length=255)
*/
private $brand;
/**
* @var string
*
* @ORM\Column(name="model", type="string", length=255)
*/
private $model;
/**
* @var bool
*
* @ORM\Column(name="gender", type="boolean")
*/
private $gender;
/**
* @var string
*
* @ORM\Column(name="description", type="text", nullable=true)
*/
private $description;
/**
* @var int
*
* @ORM\Column(name="quantity", type="integer")
*/
private $quantity;
/**
* @var int
*
* @ORM\Column(name="price", type="integer")
*/
private $price;
/**
* @var string
*
* @ORM\Column(name="imageFile", type="string", length=255)
*/
private $imageFile;
/**
* @var \DateTime
*
* @ORM\Column(name="added", type="datetime")
*/
private $added;
/**
* @var \DateTime
*
* @ORM\Column(name="updated", type="datetime", nullable=true)
*/
private $updated;
/**
* @var \DateTime
*
* @ORM\Column(name="deleted", type="datetime", nullable=true)
*/
private $deleted;
/**
* @var \DateTime
*
* @ORM\Column(name="sold", type="datetime", nullable=true)
*/
private $sold;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set fosUserId
*
* Return integer
*/
public function setFosUserId($fosUserId)
{
$this->fosUserId = $fosUserId;
return $this;
}
/**
* Get fosUserId
*
* Return Article
*/
public function getFosUserId()
{
return $this->fosUserId;
}
/**
* Set name
*
* @param string $name
*
* @return Article
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set category
*
* @param string $category
*
* @return Article
*/
public function setCategory($category)
{
$this->category = $category;
return $this;
}
/**
* Get category
*
* @return string
*/
public function getCategory()
{
return $this->category;
}
/**
* Set brand
*
* @param string $brand
*
* @return Article
*/
public function setBrand($brand)
{
$this->brand = $brand;
return $this;
}
/**
* Get brand
*
* @return string
*/
public function getBrand()
{
return $this->brand;
}
/**
* Set model
*
* @param string $model
*
* @return Article
*/
public function setModel($model)
{
$this->model = $model;
return $this;
}
/**
* Get model
*
* @return string
*/
public function getModel()
{
return $this->model;
}
/**
* Set gender
*
* @param boolean $gender
*
* @return Article
*/
public function setGender($gender)
{
$this->gender = $gender;
return $this;
}
/**
* Get gender
*
* @return bool
*/
public function getGender()
{
return $this->gender;
}
/**
* Set description
*
* @param string $description
*
* @return Article
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set quantity
*
* @param integer $quantity
*
* @return Article
*/
public function setQuantity($quantity)
{
$this->quantity = $quantity;
return $this;
}
/**
* Get quantity
*
* @return int
*/
public function getQuantity()
{
return $this->quantity;
}
/**
* Set price
*
* @param integer $price
*
* @return Article
*/
public function setPrice($price)
{
$this->price = $price;
return $this;
}
/**
* Get price
*
* @return int
*/
public function getPrice()
{
return $this->price;
}
/**
* Set imageFile
*
* @param string $imageFile
*
* @return Article
*/
public function setImageFile($imageFile)
{
$this->imageFile = $imageFile;
return $this;
}
/**
* Get imageFile
*
* @return string
*/
public function getImageFile()
{
return $this->imageFile;
}
/**
* Set added
*
* @param \DateTime $added
*
* @return Article
*/
public function setAdded($added)
{
$this->added = $added;
return $this;
}
/**
* Get added
*
* @return \DateTime
*/
public function getAdded()
{
return $this->added;
}
/**
* Set updated
*
* @param \DateTime $updated
*
* @return Article
*/
public function setUpdated($updated)
{
$this->updated = $updated;
return $this;
}
/**
* Get updated
*
* @return \DateTime
*/
public function getUpdated()
{
return $this->updated;
}
/**
* Set deleted
*
* @param \DateTime $deleted
*
* @return Article
*/
public function setDeleted($deleted)
{
$this->deleted = $deleted;
return $this;
}
/**
* Get deleted
*
* @return \DateTime
*/
public function getDeleted()
{
return $this->deleted;
}
/**
* Set sold
*
* @param \DateTime $sold
*
* @return Article
*/
public function setSold($sold)
{
$this->sold = $sold;
return $this;
}
/**
* Get sold
*
* @return \DateTime
*/
public function getSold()
{
return $this->sold;
}
}
Here is my formType ArticleType :
<?php
namespace ArticleBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('category', TextType::class)
->add('brand', TextType::class)
->add('model', TextType::class)
->add('gender', ChoiceType::class, array(
'choices' => array(
'Male' => true,
'Female' => false,
)
))
->add('description', TextareaType::class)
->add('quantity', IntegerType::class)
->add('price', MoneyType::class)
->add('imageFile', FileType::class)
->add('submit', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ArticleBundle\Entity\Article'
));
}
public function getBlockPrefix()
{
return 'articlebundle_article';
}
}
And finally my ArticleController :
<?php
namespace ArticleBundle\Controller;
use ArticleBundle\Entity\Article;
use ArticleBundle\Form\Type\ArticleType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class ArticleController extends Controller
{
/**
* @Route("/add", name="add")
*/
public function addArticle(Request $request)
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$article->setFosUserId($this->getUser());
$article->setAdded(\DateTime::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s')));
$em = $this->getDoctrine()->getManager();
$em->persist($article);
$em->flush();
return $this->render('article/add.html.twig', [
'form' => $form->createView(),
]);
}
return $this->render('article/add.html.twig', [
'form' => $form->createView(),
]);
}
}
My problem is when I flush the entity manager ($em->flush) it records my Article object in my database but without the fosUserId as foreign key that display NULL.
Your advice help me so much. Thanks
Several things you need to change.
First, as @YaatSuka suggested in his/her answer, your AppBundle\User
-Entity has an error in the setFosUserId
function:
public function setFosUserId($fosUserId)
{
$this->user = $fosUserId; // Should be: $this->fosUserId = $fosUserId;
return $this;
}
Second: In your Controller you're just getting the id of the user while you should be using the entity:
$user = $this->container->get('security.token_storage')->getToken()->getUser()->getId();
Should be:
$user = $this->container->get('security.token_storage')->getToken()->getUser();
Or, since you're inheriting the base Symfony controller:
$user = $this->getUser();
Lastly, although this shouldn't affect the error: You don't need to add the fosUerId field to the form at all since you're setting it in your controller.
Meaning: You can get rid of the hidden field in your FormType.