Почему мой метод 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())
и получить свой идентификатор
Вам не нужно поле user_id, потому что у вас отношение пользователя к полю:
/**
* @ORM\ManyToOne(targetEntity="Acme\PostBundle\Entity\User", inversedBy="posts")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
/**
Посмотрите в свою базу данных, доктрина уже создала user_id для вас.
Поскольку другие заявили, что невозможно установить $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
для вашего почтового объекта.