3

フォームからデータベースにデータを保存するときに問題が発生します

私は2つの単純なエンティティUserとTelephoneを持っています

ユーザーは複数の電話を持つことができます 電話は 1 人のユーザーしか持つことができません

データベース テーブルは次のとおりです。

ユーザー [ ID、名前、電子メール]

電話番号 [id, user_id, phone_number]

また、私のフォームには次のフィールドがあります

  • 名前
  • Eメール
  • と電話番号

フォームに入力して送信すると、次の例外が発生します

パラメータ [123456, null] を使用して「INSERT INTO telephone (phone_number, user_id) VALUES (?, ?)」を実行中に例外が発生しました:

SQLSTATE[23000]: 整合性制約違反: 1048 列 'user_id' を null にすることはできません

デバッガー バーから、4 つのクエリが実行されたことがわかります

  1. 取引開始
  2. INSERT INTO user (name, email) VALUES (?, ?) パラメータ: { 1: 'name', 2: email@yahoogmail.com }
  3. INSERT INTO telephone (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 に答える