2

ユーザーエンティティがあります。これは、この場合の主要なエンティティと見なされ、使用されているという事実は、それが存在することを意味します。

User エンティティには Store エンティティがあります。ただし、すべてのユーザーが必ずしも Store エンティティを持っているわけではありません。

これは私たちが使用している既存のデータベースであり、User テーブルの ID は Store テーブルの ID と同じであることに注意してください。名前 (id) と値。場合によっては、特定のユーザー ID のレコードが Store にないことがあります。

ユーザー:

class User extends Entity
{
    /**
    * @ORM\Id
    * @ORM\Column(type="string", length=36)
    */
    protected $id;

    /**
    * @ORM\OneToOne(targetEntity="Store")
    * @ORM\JoinColumn(name="id", referencedColumnName="id")
    */
    protected $store;

    ...
}

店:

class Store extends Entity
{
    /**
    * @ORM\Id
    * @ORM\Column(type="string", length=36)
    */
    protected $id;

    ...
}

これにより、コントローラーで問題が発生します。ユーザー エンティティに Store レコードがない場合、「エンティティが見つかりません」という例外で失敗します。これは、try catch を使用して簡単に処理できます (Entity オブジェクトが存在するかどうか、または単なるプロキシであるかどうかを確認する方法を見つけることができませんでした)。ユーザーストア レコードを持っている場合は、ここで問題ありません。

しかし、私が抱えている大きな問題は、特にフィクスチャです。

protected function createUser($id)
{
    $user = new User();
    $user->setId($id);
    $user->setEmail($id.'@example.com');
    $user->setUserName($id.'_name');
    $user->setArea($this->manager->find('Area', 156)); // Global

    $this->manager->persist($user);

    return $user;
}

Fixtures を実行すると、これは失敗します。「整合性制約違反: 1048 列 'id' を null にすることはできません」というエラーが表示されます。ユーザーからストア エンティティを削除すると、このメッセージは表示されなくなります。つまり、ストアがないとユーザーを追加できません。

何が起こっているか知っている人はいますか?私は周りを見回しましたが、エンティティ間のオプションの関係を持つことについて、教義のドキュメントを含め、何も見つかりません。これはよくある状況だと思いました。

4

2 に答える 2

1

このドキュメントページでこれに対する解決策を見つけました:

http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys.html#use-case-3-join-table-with-metadata

私の場合、id フィールドを使用して User エンティティが Store エンティティに関連付けられるのではなく、User エンティティの store プロパティがユーザー (エンティティ オブジェクト) によって Store エンティティに関連付けられます。代わりに、Store オブジェクトは、エンティティの ID として注釈が付けられた User エンティティを保持します。

私はそれが地獄のように混乱していると確信しているので、上のサンプルを見てください. 以下は私の調整されたエンティティクラスです:

ユーザー

class User extends Entity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=36)
     */
    protected $id;

    /** 
     * @ORM\OneToOne(targetEntity="Store", mappedBy="user") 
     */
    protected $store;

    ...
}

class Store extends Entity
{
    /**
     * @ORM\Column(type="string", length=36)
     */
    protected $id;

    /**
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="User")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     */
    protected $user;

    ...
}

現在、特定の User に Store レコードが存在しない場合、User エンティティの store プロパティは null になります。備品も期待どおりに実行されます。

于 2012-10-29T01:57:18.030 に答える
0

上記の回答に加えて、inversedBy属性も追加する必要がありました。そうしないと、無効なエンティティ マッピング エラーがスローされます。

上記のエンティティを使用すると、Storeオブジェクトは次のようになります。

class Store extends Entity
{
/**
 * @ORM\Column(type="string", length=36)
 */
protected $id;

/**
 * @ORM\Id
 * @ORM\OneToOne(targetEntity="User", inversedBy="store")
 * @ORM\JoinColumn(name="id", referencedColumnName="id")
 */
protected $user;

...
}
于 2016-04-26T22:08:21.523 に答える