Symfony2 / доктрина вставка с внешними ключами

0

В 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.php:



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.php:



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

Пожалуйста, помогите, потому что я застрял с ним :)

Теги:
orm
doctrine2

1 ответ

0
Лучший ответ

Прежде всего, кажется, вы неправильно поняли отношения в доктрине2.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню