3

たとえばNULLの場合に備えて、エンティティ値を変更したいと思います。残念ながら、私のコードは例外を引き起こします - 「翻訳」レコードがデータベースに作成され、id が getId メソッドによって適切に返されますが、id が設定されていないようです。

非常に単純なコードですが、なぜ機能しないのでしょうか?

public function createAction(Request $request)
{
    $entity  = new Word();
    $form = $this->createForm(new WordType(), $entity);
    $form->bind($request);


    if ($form->isValid()) {

        $em = $this->getDoctrine()->getManager();

        //works fine - database record is created
        if($entity->getIdTranslation() == NULL){
            $translation = new Translation();
            $em->persist($translation);
            $em->flush();
            $entity->setIdTranslation($translation->getId());
        }


        $em->persist($entity);
        //throws exception - Integrity constraint violation: 1048 Column 'id_translation' cannot be null  
        $em->flush();

        return $this->redirect($this->generateUrl('admin_word_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

編集:私のモデルとマッピング情報の一部を追加しました:

overwiev のモデルの一部

Revelant Words マッピング:

 /**
 * @var integer $id_language
 *
 * @ORM\Column(name="id_language", type="integer")
 */
private $id_language;
/**
 *@ORM\ManyToOne(targetEntity="Language", inversedBy="words")
 *@ORM\JoinColumn (name="id_language", referencedColumnName="id")
 */
protected $language;

/**
 *
 * @ORM\ManyToOne(targetEntity="Translation", inversedBy="words")
 * @ORM\JoinColumn(name="id_translation", referencedColumnName="id")
 */
protected $translation;

および翻訳:

class Translation
 {

public function __construct() {
    $this->words = new ArrayCollection();
}
/**
 * @ORM\PrePersist()
 */
public function prePersist() {
    $this->created_date = new \DateTime();
}
 /**
 *
 * @ORM\OneToMany(targetEntity="Word" ,mappedBy="translation")
 */
protected $words;

また、補足: Symfony コンソール ツールではなく、データベース モデリング ソフトウェア (ワークベンチ) を使用して db モデルを作成しました。現在、db モデルを反映するようにエンティティをセットアップしようとしています。そのアプローチが正しいかどうかはわかりません - おそらく私のモデルは複雑すぎて Doctrine で適切に動作しませんか?

4

2 に答える 2

1

これに適した場所は、Wordクラスのコンストラクターです。

class Word
{
    /**
     * @OneToOne(targetEntity="Translation", cascade={"persist"})
     */
    private $translation;

    public function __construct()
    {
        $this->translation = new Translation;
    }
}

ところで、Doctrine によって処理されるため、翻訳 ID を手動で永続化する必要はありません。

$word = new Word;

$em->persist($word);
$em->flush();

$translation = $word->getTranslation();
$translationId = $translation->getId();
于 2012-10-05T06:39:14.303 に答える