我正在使用Symfony 2和Doctrine 2.我有2个实体用户和电子邮件。用户可以拥有许多电子邮件。关系设置如下。
class User
{
/**
* @ORM\OneToMany(targetEntity="UserEmail", mappedBy="user", cascade={"persist"})
*/
protected $emails;
}
class UserEmail
{
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="user_emails")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
}
在控制器中,我正在做这样的事情。
$user = new User();
$email = new UserEmail();
$user->getEmails()->add($email);
$user->setLocked(false)->setCreatedAt(new \DateTime());
$form = $this->createForm(new RegisterUser(), $user, array(
'action' => $this->generateUrl('register'),
));
$form->handleRequest($request);
if($request->getMethod() == 'POST'){
if ($form->isValid()) {
$registration = $form->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($registration);
$em->flush();
}
}
但是我收到这样的错误。
An exception occurred while executing 'INSERT INTO user_emails (id, user_id, email, is_verified, token, is_primary, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["2abbe629-264d-471b-a9dd-4a471657e61c", null, "re@re.com", null, null, null, null, null, null]:
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "user_id" violates not-null constraint
DETAIL: Failing row contains (2abbe629-264d-471b-a9dd-4a471657e61c, null, re@re.com, null, null, null, null, null, null).
500 Internal Server Error - DBALException
1 linked Exception:
PDOException
请有人帮助我。我是Symfony 2世界的新手。
答案 0 :(得分:0)
尝试更改inversedBy
类上的UserEmail
注释,如下所示:
class UserEmail
{
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="emails")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
}
希望这个帮助
答案 1 :(得分:0)
最后我能够解决这个问题。我发布了解决方案,以便其他人可以从中受益。
我必须建立这样的双向关系。
$user = new User();
$email = new UserEmail();
$user->getEmails()->add($email);
$email->setUser($user);
然后我必须启用这样的级联验证进行验证。 (RegisterUser.php)
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Django\Bundle\UserBundle\Entity\User',
'cascade_validation' => true //This is cascades the validation
));
}
现在,为了验证独特的实体,我必须这样做,因为电子邮件必须是唯一的。
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
/**
* UserEmail
*
* @ORM\Table(name="dj_user_emails")
* @ORM\Entity(repositoryClass="Django\Bundle\UserBundle\Repository\UserEmail")
* @UniqueEntity("email", message="email_in_use")
*/
class UserEmail
{
/**
* @var string Email
*
* @Assert\NotBlank()
* @Assert\Email()
*
* @ORM\Column(name="email", type="string", length=128, unique=true)
*/
private $email;
我希望这有助于某人。