salut
j'ai fait une relation many to one entre le table user et le table news
dans la classe News

class News

{

  /**

   * @ORM\ManyToOne(targetEntity="SN\UserBundle\Entity\User")

   * @ORM\JoinColumn(nullable=false)

   */

  private $user;

lorsque j'ajoute une news l'ajout fonctionne normalement mais la colonne user-id dans le table news est toujour null comment resoudre ce probleme
merci

6 réponses


Bonjour,
avant de sauvegarder tes données en base il faut instancier le champ user_id en lui donnant la valeur

$this->getUser()->getId();

si tu extends base controller

$this->get('security.token_storage')->getToken()->getUser()->getId();

sinon.
Mais il est possible que je me trompe car je ne suis pas utilisateur de symphony (j'ai juste le souvenir d'avoir vu ça quelque part ^^).
Il serait donc préférable d'attendre confirmation.

Cordialement.

je penses que cela vient du nom du champ. Dans l'entité il est nommé "user", hors en base tu annonces qu'il est nommé "user-id" .
Essais donc d'ajouter: name="user-id", referencedColumnName="id" à joinColumn afin qu'il sache a quoi se referer.

Je te laisse adapter les de attributs a ton cas.

/**

   * @ORM\ManyToOne(targetEntity="SN\UserBundle\Entity\User")

   * @ORM\JoinColumn(name="user-id", referencedColumnName="id", nullable=false) 

   */

  private $user;

Après tu peux nous faire voir aussi le code ou tu enregistres la news pour être sûr que tu attaches bien l'utilisateur aussi.

houssem
Auteur

public function addAction(Request $request)

{
if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) {

  // Sinon on déclenche une exception « Accès interdit »

  throw new AccessDeniedException('Accès limité aux auteurs.');

}
  $news = new News();
  $form = $this->createForm(new NewsType(), $news);
if ($form->handleRequest($request)->isValid()) {
  $em = $this->getDoctrine()->getManager();
  $em->persist($news);

  $em->flush();
  // Ici, on s'occupera de la création et de la gestion du formulaire

  $request->getSession()->getFlashBag()->add('notice', 'news bien enregistrée.');

  // Puis on redirige vers la page de visualisation de cettte annonce

  return $this->redirect($this->generateUrl('sn_sys_news_view', array('id' => $news->getId())));

}

return $this->render('SNSysNewsBundle:News:add.html.twig', array('form'=>$form->createView(),));

}
c'est le code pour ajouter une news

Tu peux aussi ajouter le code NewsType car là à aucun moment tu associes un utilisateur à ta news donc normal que ton champ reste à NULL. Y'a pas de magie, à un moment donné il faut faire un $news->setUser($user);

    public function createAction(Request $request)
    {

        if (!$this->get('security.context')->isGranted('ROLE_USER')) {
            throw new AccessDeniedException($this->get('translator')->trans('error.access_restricted', array(), 'DemoAppBundle'));
        }

        $news = new News();

        if ($this->getUser()) {
            $news->setAuthor($this->getUser());
        }

        $form = $this->createForm(new NewsType(), $news);

        if ($request->getMethod() == 'POST') {
            $form->handleRequest($request);

            if ($form->isValid()) {

                $em = $this->getDoctrine()->getManager();
                $em->persist($news);
                $em->flush();
                $this->get('session')->getFlashBag()->add('success', $this->get('translator')->trans('new.create.success'));
                return $this->redirect($this->generateUrl('sn_sys_news_view', array('slug' => $news->getId())));
            } else {
                $this->get('session')->getFlashBag()->add('danger', $this->get('translator')->trans('idea.create.error'));
            }

        }

        return array('form' => $form->createView());
    }

Quelque chose comme ça, sans doute.