Symfony2原则异常插入


symfony2 doctrine exception insert

在symfony2中,当我将数据插入到数据库中时,我收到一个异常:

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;
    }
}

代码,当我试图插入到数据库:

   $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();

我还检查了(与var_dump)变量$user_id,但不为空,我收到用户id。

Thanks in advance

你不需要$user_id,正如FuzzyTree告诉你的,但你需要通过添加$submit_dictation->setUser($user)而不是$submit_dictation->setUserId($user->getId())来填充$user属性,当你插入数据库时

这就是为什么Doctrine很有用,你不需要理解关系是如何工作的:你不需要给出一个id,只需要给出实体本身。