Почему метод setUserId не работает в сущности symfony2?

0

Почему мой метод setUserId не работает? Это мое почтовое отправление:

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\PostBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="posts")
 */
class Post
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     *
     * @ORM\Column(type="integer",  nullable=false)
     */
    public $user_id;

    /**
     * @ORM\ManyToOne(targetEntity="Acme\PostBundle\Entity\User", inversedBy="posts")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;
    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank(message="Введите текст")
     * )
     */
    protected $text;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $address;
    /**
     *
     * @ORM\Column(type="datetime")
     */
    protected $date;


    /**
     * Get id
     *
     * @return integer 
     */

    public function getId()
    {
        return $this->id;
    }

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

        return $this;
    }

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

    public function getText()
    {
        return $this->text;
    }

    public function __construct() {
        $this->date = new \DateTime();
    }
    //...

}

И мой пользовательский объект:

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\PostBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;
    /**
     *
     * @ORM\Column(type="string")
     */
    protected $path;

    /**
     *
     * @ORM\Column(type="string")
     */
    protected $username;
    /**
    * @ORM\OneToMany(targetEntity="Acme\PostBundle\Entity\Post", mappedBy="users")
    */
    protected $posts;

    public function __construct() {

        $this->posts = new ArrayCollection();

    }


}

Я сохраняю в базе данных через контроллер:

 public function createAction(Request $request)
    {
        $post = new Post();

        $form = $this->createFormBuilder($post)
                     ->add('text')
                     ->add('address')
                     ->getForm();
        $post->setUserId($this->getUser()->getId());

        $form->handleRequest($request);

        if($form->isValid()){
            $em = $this->getDoctrine()->getManager();
            $em->persist($post);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('home'));    
    }

И я бросаю эту ошибку:

Integrity constraint violation: 1048 Column 'user_id' cannot be null Почему? Мой $this->getUser()->getId() не является нулевым, я попытался return new Response($this->getUser()->getId()) и получить свой идентификатор

Теги:
doctrine2

2 ответа

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

Вам не нужно поле user_id, потому что у вас отношение пользователя к полю:

 /**
 * @ORM\ManyToOne(targetEntity="Acme\PostBundle\Entity\User", inversedBy="posts")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;
/**

Посмотрите в свою базу данных, доктрина уже создала user_id для вас.

  • 0
    Я не понимаю, почему мне не нужно поле пользователя в моей сущности? когда я выбираю это поле, возвращает мне пользовательский объект, посмотрите: pastebin.com/5nuBZiD6 если я использую вашу версию, вы можете сделать вставку в базу данных, но мой выбор не работает
  • 0
    удалить поле user_id
Показать ещё 1 комментарий
0

Поскольку другие заявили, что невозможно установить $userId самостоятельно, если вы также определили свойство $user как объект, использующий тот же столбец базы данных.

Вместо этого измените свои сеттеры и сохраните все остальное, как есть:

class Post
{
    // ...

    /**
     * Set user_id
     *
     * @param integer $userId
     * @throws \Exception
     */
    public function setUserId($userId)
    {
        throw new \Exception('Post->userId can not be set directly');
    }

    /**
     * Set user
     *
     * @param User $user
     * @return Post
     */
    public function setUser($user)
    {
        $this->user    = $user;
        $this->user_id = $user->getId();

        return $this;
    }

    // ...
}

Теперь $userId автоматически обновляется при использовании setUser(...). Выбрасывание исключения в setUserId помогает предотвратить ошибки в коде. Конечно, вы также можете просто удалить сеттер, но затем он будет воссоздаваться каждый раз, когда вы запускаете другую doctrine:generate:entities для вашего почтового объекта.

Ещё вопросы

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