フォームからデータベースにデータを保存するときに問題が発生します
私は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 つのクエリが実行されたことがわかります
- 取引開始
- INSERT INTO user (name, email) VALUES (?, ?) パラメータ: { 1: 'name', 2: email@yahoogmail.com }
- INSERT INTO telephone (phone_number, user_id) VALUES (?, ?) パラメータ: { 1: 123456, 2: null }
- ロールバック
この例外が発生した理由は理解できますが、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(),
));
}
}
この長い投稿で申し訳ありません
誰でも私を助けることができますか?
私はそれを大いに感謝します!