保存儿童记录不适用于学说

时间:2014-10-15 02:58:25

标签: symfony doctrine-orm

我正在使用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世界的新手。

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;

我希望这有助于某人。