Symfony2/学说插入外键


Symfony2/doctrine insert whi foreign keys

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


     An exception occurred while executing 'INSERT INTO forum_posts (topic_id, user_id, is_first, post, cdate) VALUES (?, ?, ?, ?, ?)' with params [null, null, "0", "lorem ipsum dooorrrrllosdosodsdd", "2015-02-17 11:35:22"]:
    SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'topic_id' ne peut être vide (null) (500 Internal Server Error)

ForumPosts.hp:


namespace Test'TestBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
/**
 * ForumCategories
 * @ORM'Table(name="forum_posts")
 * @ORM'Entity
 */
class ForumPosts
{
    /**
     * @ORM'ManyToOne(targetEntity="ForumTopics", inversedBy="forum_posts")
     * @ORM'JoinColumn(name="topic_id", referencedColumnName="id")
     */
    private $topic_id;
    protected $topic;
    private $posts;
    /**
     * @ORM'Id
     * @ORM'Column(type="integer")
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var integer
     *
     * @ORM'Column(name="topic_id", type="integer", type="decimal", options={"default"="0"})
     */
    private $topicId;
    /**
     * @var integer
     *
     * @ORM'Column(name="user_id", type="integer", type="decimal", options={"default"="0"})
     */
    private $userId;
    /**
     * @ORM'ManyToOne(targetEntity="User", inversedBy="forum_topics")
     * @ORM'JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $userName;
    /**
     * @var integer
     *
     * @ORM'Column(name="is_first", type="boolean", options={"default"="false"})
     */
    private $isFirst;
    /**
     * @var string
     *
     * @ORM'Column(name="post", type="string")
     */
    private $post;
    /**
     * @var 'DateTime
     *
     * * @ORM'Column(name="cdate", type="datetime")
     */
    private $cdate;

    /**
     * Set topicId
     *
     * @param integer $topicId
     * @return ForumTopics
     */
    public function setTopicId($topicId)
    {
        $this->topicId = $topicId;
        return $this;
    }
    /**
     * Get topicId
     *
     * @return integer 
     */
    public function getTopicId()
    {
        return $this->topicId;
    }
    /**
     * Set userId
     *
     * @param integer $userId
     * @return ForumPosts
     */
    public function setUserId($userId)
    {
        $this->userId = $userId;
        return $this;
    }
    /**
     * Get userId
     *
     * @return integer
     */
    public function getUserId()
    {
        return $this->userId;
    }
    /**
     * Set user
     *
     * @param User $user
     * @return User
     */
    public function setUser(User $user)
    {
        $this->user = $user;
        return $this;
    }
/**
     * Set topic
     *
     * @param 'Test'TestBundle'Entity'ForumTopics $topic
     * @return ForumTopics
     */
    public function setTopic('Test'TestBundle'Entity'ForumTopics $topic = null)
    {
        $this->topic = $topic;
        return $this;
    }   
    /**
     * Set isFirst
     *
     * @param integer $isFirst
     * @return ForumPosts
     */
    public function setIsFirst($isFirst)
    {
        $this->isFirst = $isFirst;
        return $this;
    }
    /**
     * Get isFirst
     *
     * @return integer
     */
    public function getIsFirst()
    {
        return $this->isFirst;
    }
    /**
     * Set post
     *
     * @param string $post
     * @return ForumPosts
     */
    public function setPost($post)
    {
        $this->post = $post;
        return $this;
    }
    /**
     * Get post
     *
     * @return string 
     */
    public function getPost()
    {
        return $this->post;
    }
    /**
     * Set cdate
     *
     * @param 'DateTime $cdate
     * @return ForumPosts
     */
    public function setCdate($cdate)
    {
        $this->cdate = $cdate;
        return $this;
    }
    /**
     * Get cdate
     *
     * @return 'DateTime 
     */
    public function getCdate()
    {
        return $this->cdate;
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
}

ForumTopics.hp:


namespace Test'TestBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
/**
 * ForumCategories
 * @ORM'Table(name="forum_topics")
 * @ORM'Entity
 */
class ForumTopics
{

    /**
     * @ORM'ManyToOne(targetEntity="ForumCategories", inversedBy="forum_topics")
     * @ORM'JoinColumn(name="cat_id", referencedColumnName="id")
     */
    private $cat_id;
    protected $category;
    /**
     * @var integer
     *
     * @ORM'Column(name="user_id", type="integer", type="decimal", options={"default"="0"})
     */
    private $userId;
    /**
     * @ORM'ManyToOne(targetEntity="User", inversedBy="forum_topics")
     * @ORM'JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $userName;

    /**
     * @ORM'OneToMany(targetEntity="ForumPosts", mappedBy="topic_id")
     */
    public $topic_id;
    protected $posts;
    public function __construct()
    {
        $this->posts = new ArrayCollection();

    }


    /**
     * @ORM'Id
     * @ORM'Column(type="integer")
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var integer
     *
     * @ORM'Column(name="cat_id", type="integer", type="decimal", options={"default"="0"})
     */
    private $catId;

    /**
     * @var string
     *
     * @ORM'Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var 'DateTime
     *
     * * @ORM'Column(name="cdate", type="datetime")
     */
    private $cdate;
    /**
     * @var 'DateTime
     *
     * * @ORM'Column(name="lastpost", type="datetime")
     */
    private $lastpost;


    /**
     * Set catId
     *
     * @param integer $catId
     * @return ForumTopics
     */
    public function setCatId($catId)
    {
        $this->catId = $catId;
        return $this;
    }
    /**
     * Get catId
     *
     * @return integer 
     */
    public function getCatId()
    {
        return $this->catId;
    }
    /**
     * Set name
     *
     * @param string $name
     * @return ForumTopics
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Set userId
     *
     * @param integer $userId
     * @return User
     */
    public function setUserId($userId)
    {
        $this->userId = $userId;
        return $this;
    }
    /**
     * Get userId
     *
     * @return integer 
     */
    public function getUserId()
    {
        return $this->userId;
    }
    /**
     * Set cdate
     *
     * @param 'DateTime $cdate
     * @return ForumTopics
     */
    public function setCdate($cdate)
    {
        $this->cdate = $cdate;
        return $this;
    }
    /**
     * Get cdate
     *
     * @return 'DateTime 
     */
    public function getCdate()
    {
        return $this->cdate;
    }
    /**
     * Set lastpost
     *
     * @param 'DateTime $lastpost
     * @return ForumTopics
     */
    public function setLastpost($lastpost)
    {
        $this->lastpost = $lastpost;
        return $this;
    }
    /**
     * Get lastpost
     *
     * @return 'DateTime 
     */
    public function getLastpost()
    {
        return $this->lastpost;
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set category
     *
     * @param 'Test'TestBundle'Entity'ForumCategories $category
     * @return ForumTopics
     */
    public function setCategory('Test'TestBundle'Entity'ForumCategories $category = null)
    {
        $this->category = $category;
        return $this;
    }
    /**
     * Get catId
     *
     * @return 'Test'TestBundle'Entity'ForumCategories 
     */
    public function getCategory()
    {
        return $this->catId;
    }

    /**
     * Add posts
     *
     * @param 'Test'TestBundle'Entity'ForumPosts $posts
     * @return ForumTopics
     */
    public function addPost('Test'TestBundle'Entity'ForumPosts $posts)
    {
        $this->posts[] = $posts;
        return $this;
    }
    /**
     * Remove posts
     *
     * @param 'Test'TestBundle'Entity'ForumPosts $posts
     */
    public function removePost('Test'TestBundle'Entity'ForumPosts $posts)
    {
        $this->posts->removeElement($posts);
    }
    /**
     * Get posts
     *
     * @return 'Doctrine'Common'Collections'Collection
     */
    public function getPosts()
    {
        return $this->posts;
    }

}

User.php:



use Doctrine'ORM'Mapping as ORM;
use FOS'UserBundle'Model'User as BaseUser;

/**
 * User
 *
 * @ORM'Table()
 * @ORM'Entity
 */
class User extends BaseUser
{
    /**
     * @ORM'Id
     * @ORM'Column(type="integer")
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    public $id;
    /**
     * @ORM'Column(name="avatar", type="string", length=255, nullable=true)
     * @var string
     */
    private $avatar;
    /**
     * @ORM'Column(name="firstName", type="string", length=100, nullable=true)
     * @var string
     */
    private $firstName;
    /**
     * @ORM'Column(name="lastName", type="string", length=100, nullable=true)
     * @var string
     */
    private $lastName;
    /**
     * @ORM'Column(name="description", type="text", nullable=true)
     * @var string
     */
    private $description;
    public $salt;


    public function __construct()
    {
        parent::__construct();
    }

    /**
     * @return mixed
     */
    public function getLastName()
    {
        return $this->lastName;
    }
    /**
     * @param mixed $lastName
     * @return $this
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;
        return $this;
    }
    /**
     * @return mixed
     */
    public function getFirstName()
    {
        return $this->firstName;
    }
    /**
     * @param mixed $firstName
     * @return $this
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;
        return $this;
    }
    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }
    /**
     * @param string $description
     * @return $this
     */
    public function setDescription($description)
    {
        $this->description = $description;
        return $this;
    }
    /**
     * @param string $password
     * @return $this
     */
    public function setPassword($password)
    {
        $this->password = $password;
    }

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

}

当我尝试从ForumPostController:插入数据库时的代码


$em = $this->getDoctrine()->getManager();
        $cur_date = date_create(date('Y-m-d H:i:s'));
        $product = new ForumPosts();
        $product->setTopic($em->getRepository('TestTestBundle:ForumTopics')->findOneById($request->request->get('topicId'));
        $product->setUser($em->getRepository('TestTestBundle:User')->findOneById($request->request->get('userId')));
        $product->setIsFirst($request->request->get('isFirst'));
        $product->setPost($request->request->get('post'));
        $product->setCdate($cur_date);
        $em = $this->getDoctrine()->getManager();
        $em->persist($product);
        $em->flush();
        return new Response('Created record id '.$product->getId());

请帮忙,因为我被它卡住了:)

首先,您似乎误解了doctrine2中的关系。

class ForumPosts
{
    // ...
    /**
     * @ORM'ManyToOne(targetEntity="ForumTopics", inversedBy="forum_posts")
     * @ORM'JoinColumn(name="topic_id", referencedColumnName="id")
     */
    private $topic_id;
    protected $topic;
    private $posts;
    // ...
    /**
     * @var integer
     *
     * @ORM'Column(name="topic_id", type="integer", type="decimal", options={"default"="0"})
     */
    private $topicId;
}

您的@ORM''Column是无用的,因为ORM''JoinColumn可以做到这一点(或多或少,可能更好)。此外,您的属性$topic_id应该被称为$topic,因为您将只使用ForumTopics对象。

以下是处理关系的好方法(允许有一个可为null的关系,并修复sql错误):

class ForumPosts
{
    // ...
    /**
     * @ORM'ManyToOne(targetEntity="ForumTopics", inversedBy="forum_posts")
     * @ORM'JoinColumn(name="topic_id", referencedColumnName="id", nullable=true)
     */
    private $topic;
}