3

当我想将数据从表单保存到数据库时遇到问题

我有两个简单的实体用户和电话

一个用户可以有多个电话 一个电话只能有一个用户

数据库表是:

用户 [ id, 姓名, 电子邮件]

电话 [id, user_id, phone_number]

我的表格也有以下字段

  • 一个名字
  • 一封电邮
  • 和电话号码

当我填写并提交表格时,我得到以下异常

使用参数 [123456, null] 执行“INSERT INTO phone (phone_number, user_id) VALUES (?, ?)”时发生异常:

SQLSTATE [23000]:违反完整性约束:1048 列 'user_id' 不能为空

从调试器栏中,我看到执行了 4 个查询

  1. 开始交易
  2. INSERT INTO user (name, email) VALUES (?, ?) 参数:{ 1: 'name', 2: email@yahoogmail.com }
  3. INSERT INTO phone (phone_number, user_id) VALUES (?, ?) 参数:{ 1: 123456, 2: null }
  4. 回滚

我明白为什么会发生这个异常,但我不明白为什么 user_id 会得到 NULL 值。

这是我的代码(我从某些属性中省略了 getter 、 setter 和注释)

用户实体

class User
{

private $name;

private $email;

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/** 
 * @var \Acme\FormBundle\Entity\Telephone
 *
 * @ORM\OneToMany(targetEntity="Acme\FormBundle\Entity\Telephone", mappedBy="user", cascade={"ALL"})
 */
private $telephones;

/**
 * Constructor
 */
public function __construct()
{
    $this->telephones = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add telephones
 *
 * @param \Acme\FormBundle\Entity\Telephone $telephones
 * @return User
 */
public function addTelephone(\Acme\FormBundle\Entity\Telephone $telephones)
{
    $this->telephones[] = $telephones;
    $telephones->setUser($this);

    return $this;
}

/**
 * Remove telephones
 *
 * @param \Acme\FormBundle\Entity\Telephone $telephones
 */
public function removeTelephone(\Acme\FormBundle\Entity\Telephone $telephones)
{
    $this->telephones->removeElement($telephones);
}

/**
 * Get telephones
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getTelephones()
{
    return $this->telephones;
}
}

电话实体

class Telephone
{
private $phoneNumber;

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var \Acme\FormBundle\Entity\User
 *
 * @ORM\ManyToOne(targetEntity="Acme\FormBundle\Entity\User", inversedBy="telephones")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
private $user;

/**
 * Set user
 *
 * @param \Acme\FormBundle\Entity\User $user
 * @return Telephone
 */
public function setUser(\Acme\FormBundle\Entity\User $user = null)
{
    $this->user = $user;

    return $this;
}

/**
 * Get user
 *
 * @return \Acme\FormBundle\Entity\User 
 */
public function getUser()
{
    return $this->user;
}
} 

用户类型

class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name')
        ->add('email')
        ->add('telephones', 'collection', array('type' => new TelephoneType()))
        ->add('save it', 'submit');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\FormBundle\Entity\User',
        ));
}

public function getName()
{
    return 'user';
}
}

电话类型

class TelephoneType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('phoneNumber');

}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\FormBundle\Entity\Telephone',
        ));
}

public function getName()
{
    return 'telephone';
}
}

和我的控制器

class DefaultController extends Controller
{
public function indexAction(Request $request)
{
    $user = new User();
    $Telephone1 = new Telephone(); 

    $user->getTelephones()->add($Telephone1);

    $form = $this->createForm(new UserType(), $user);

    $form->handleRequest($request);

    if ($form->isValid()) {

        $em = $this->getDoctrine()->getManager();
        $em->persist($user);
        $em->flush();

    }

    return $this->render('AcmeFormBundle:Default:index.html.twig', array(
        'form' => $form->createView(),
        ));
}
}

抱歉发了这么长的帖子

有人可以帮我吗?

我会很感激的!

4

2 回答 2

2

我换了

$user->getTelephones()->add($Telephone1);

$user->addTelephone($Telephone1);

在我的控制器中

于 2013-09-10T15:18:59.650 回答
1

这是因为你使用getData()和比persist()它。你应该这样做:

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($user);
    $em->flush();
}
于 2013-09-08T17:00:15.587 回答