0

私のコード:

        $item = new Entity\Item();

        $item->setAccountId($account["id"]);
        $item->setCategory((string)$data->category);
        $item->setRegion((string)$data->region);
        $item->setFlag(0);
        $item->setRank(0);
        $item->setPhone("");
        $item->setEmail("");
        $item->setURL((string)$data->url);
        $item->setTags($tags);

        //var_dump($item);
        //die();

        $this->em->persist($item);
        $this->em->flush();
        $this->em->clear();

注釈の関係:

/////////////////////////////////////////////////////////////////////////
// Relations                                                     //
/////////////////////////////////////////////////////////////////////////

/**
* @ManyToOne(targetEntity="Account", inversedBy="items")
* @JoinColumn(name="account_id", referencedColumnName="id")
*/
private $account;

/////////////////////////////////////////////////////////////////////////
// ForeingKey                                                           //
/////////////////////////////////////////////////////////////////////////

/**
 * @Column(type="integer")
 */
protected $account_id;   

古いドクトリン(2.0)を使用する場合、コードは機能します。2.2に設定すると、コードは次の例外をスローします。

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

2.2では、親エンティティを使用してChieldエンティティを挿入する必要がありますか?

4

1 に答える 1

0

Doctrine2の観点からは、オブジェクトは、外部キーが配置されていないオブジェクトグラフを形成する必要があります。このため、あなたが本当に奇妙だと思います

  • 外部キーであるattribute_idプロパティを持っている
  • 2.0で動作したと言う

2.0でどうだったかはわかりませんが、プロパティに関連オブジェクトのIDが含まれていたことを覚えていません。

したがって、Doctrineがリレーションを正しく処理するには、$ account_idプロパティを削除し、$ item-> setAccount($ account)を使用する必要があります。$accountはクラスAccountのオブジェクトです。

次のコマンドを使用して、Doctrineにエンティティスケルトンを生成させることもできます。

php doctrine.php orm:generate-entities /tmp/entites

そして、/ tmp / entityに生成されたファイルを確認すると、どのように見えるかがわかります。

于 2012-04-26T19:26:57.360 に答える