简体   繁体   中英

symfony2 doctrine exception insert

In symfony2 when I insert data into to database I receive an exception:

An exception occurred while executing 'INSERT INTO practice_user (user_id, practice_id, practice_text, type_id) VALUES (?, ?, ?, ?)' with params [null, "1", "test", 2]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null

PracticeUser.php:

<?php

namespace fl\PracticeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="practice_user")
 */
class PracticeUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $submit_practice_id;

    /**
     * @ORM\Column(type="integer")
     */
    protected $user_id;

    /**
     * @ORM\Column(type="integer")
     */
    protected $practice_id;

    /**
     * @ORM\Column(type="text")
     */
    protected $practice_text;

    /**
     * @ORM\Column(type="integer")
     */
    protected $type_id;

    //many-to-one fos_user
    /**     
     * @ORM\ManyToOne(targetEntity="fl\UserBundle\Entity\User", inversedBy="practices")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)) 
     */
    protected $user;

    /**
     * Get submit_practice_id
     *
     * @return integer 
     */
    public function getSubmitPracticeId()
    {
        return $this->submit_practice_id;
    }

    /**
     * Set user_id
     *
     * @param integer $userId
     * @return PracticeUser
     */
    public function setUserId($userId)
    {
        $this->user_id = $userId;

        return $this;
    }

    /**
     * Get user_id
     *
     * @return integer 
     */
    public function getUserId()
    {
        return $this->user_id;
    }

    /**
     * Set practice_id
     *
     * @param integer $practiceId
     * @return PracticeUser
     */
    public function setPracticeId($practiceId)
    {
        $this->practice_id = $practiceId;

        return $this;
    }

    /**
     * Get practice_id
     *
     * @return integer 
     */
    public function getPracticeId()
    {
        return $this->practice_id;
    }

    /**
     * Set practice_text
     *
     * @param string $practiceText
     * @return PracticeUser
     */
    public function setPracticeText($practiceText)
    {
        $this->practice_text = $practiceText;

        return $this;
    }

    /**
     * Get practice_text
     *
     * @return string 
     */
    public function getPracticeText()
    {
        return $this->practice_text;
    }

    /**
     * Set type_id
     *
     * @param integer $typeId
     * @return PracticeUser
     */
    public function setTypeId($typeId)
    {
        $this->type_id = $typeId;

        return $this;
    }

    /**
     * Get type_id
     *
     * @return integer 
     */
    public function getTypeId()
    {
        return $this->type_id;
    }

    /**
     * Set user
     *
     * @param \fl\UserBundle\Entity\User $user
     * @return PracticeUser
     */
    public function setUser(\fl\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \fl\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
}

User.php

<?php

namespace fl\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    //one-to-one user_detail
    /**
     * @ORM\OneToOne(targetEntity="fl\UserBundle\Entity\UserDetail", mappedBy="user") 
     */
    protected $user_detail; 

    //one-to-one account
    /**
     * @ORM\OneToOne(targetEntity="fl\UserBundle\Entity\Account", mappedBy="user") 
     */
     protected $account;

     //one-to-many language_user
    /**
     * @ORM\OneToMany(targetEntity="fl\UserBundle\Entity\LanguageUser", mappedBy="user") 
     */
    protected $languageusers;

    //one-to-many practice_user
    /**
     * @ORM\OneToMany(targetEntity="fl\PracticeBundle\Entity\PracticeUser", mappedBy="user")
     */
    protected $practices;

    //one-to-many practice_review
    /**
     * @ORM\OneToMany(targetEntity="fl\PracticeBundle\Entity\PracticeReview", mappedBy="user") 
     */
    protected $reviews;

    public function __construct()
    {
        parent::__construct();
        // your own logic

        //one to many with language_user table
        $this->languageusers = new ArrayCollection();

        //one-to-many practice_user
        $this->practices = new ArrayCollection();

        //one-to-many practice_review
        $this->reviews = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set user_detail
     *
     * @param \fl\UserBundle\Entity\UserDetail $userDetail
     * @return User
     */
    public function setUserDetail(\fl\UserBundle\Entity\UserDetail $userDetail = null)
    {
        $this->user_detail = $userDetail;

        return $this;
    }

    /**
     * Get user_detail
     *
     * @return \fl\UserBundle\Entity\UserDetail 
     */
    public function getUserDetail()
    {
        return $this->user_detail;
    }

    /**
     * Set account
     *
     * @param \fl\UserBundle\Entity\Account $account
     * @return User
     */
    public function setAccount(\fl\UserBundle\Entity\Account $account = null)
    {
        $this->account = $account;

        return $this;
    }

    /**
     * Get account
     *
     * @return \fl\UserBundle\Entity\Account 
     */
    public function getAccount()
    {
        return $this->account;
    }

    /**
     * Add languageusers
     *
     * @param \fl\UserBundle\Entity\LanguageUser $languageusers
     * @return User
     */
    public function addLanguageuser(\fl\UserBundle\Entity\LanguageUser $languageusers)
    {
        $this->languageusers[] = $languageusers;

        return $this;
    }

    /**
     * Remove languageusers
     *
     * @param \fl\UserBundle\Entity\LanguageUser $languageusers
     */
    public function removeLanguageuser(\fl\UserBundle\Entity\LanguageUser $languageusers)
    {
        $this->languageusers->removeElement($languageusers);
    }

    /**
     * Get languageusers
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getLanguageusers()
    {
        return $this->languageusers;
    }

    /**
     * Add practices
     *
     * @param \fl\PracticeBundle\Entity\PracticeUser $practices
     * @return User
     */
    public function addPractice(\fl\PracticeBundle\Entity\PracticeUser $practices)
    {
        $this->practices[] = $practices;

        return $this;
    }

    /**
     * Remove practices
     *
     * @param \fl\PracticeBundle\Entity\PracticeUser $practices
     */
    public function removePractice(\fl\PracticeBundle\Entity\PracticeUser $practices)
    {
        $this->practices->removeElement($practices);
    }

    /**
     * Get practices
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getPractices()
    {
        return $this->practices;
    }

    /**
     * Add reviews
     *
     * @param \fl\PracticeBundle\Entity\PracticeReview $reviews
     * @return User
     */
    public function addReview(\fl\PracticeBundle\Entity\PracticeReview $reviews)
    {
        $this->reviews[] = $reviews;

        return $this;
    }

    /**
     * Remove reviews
     *
     * @param \fl\PracticeBundle\Entity\PracticeReview $reviews
     */
    public function removeReview(\fl\PracticeBundle\Entity\PracticeReview $reviews)
    {
        $this->reviews->removeElement($reviews);
    }

    /**
     * Get reviews
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getReviews()
    {
        return $this->reviews;
    }
}

code when I try insert to the DataBase:

   $user_id = $user->getId();
   $submit_dictation = new PracticeUser();
   $submit_dictation->setUserId($user_id);
   $submit_dictation->setPracticeId($dictation_id);
   $submit_dictation->setPracticeText($get_user_answer);
   $submit_dictation->setTypeId(self::PRACTICE_DICTATION);

   $em = $this->getDoctrine()->getManager();
   $em->persist($submit_dictation);
   $em->flush();

I also checked(with var_dump )the variable $user_id but is not null, I receive the user id.

Thanks in advance

You don't need $user_id , as FuzzyTree told you, but you need to fill the $user attribute by adding $submit_dictation->setUser($user) instead of $submit_dictation->setUserId($user->getId()) when you insert in the database.

This is why, among other things, Doctrine is useful, you don't need to understant how relations work : you don't need to give an id but just the entity itself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM