ユーザーエンティティがあります。これは、この場合の主要なエンティティと見なされ、使用されているという事実は、それが存在することを意味します。
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 にすることはできません」というエラーが表示されます。ユーザーからストア エンティティを削除すると、このメッセージは表示されなくなります。つまり、ストアがないとユーザーを追加できません。
何が起こっているか知っている人はいますか?私は周りを見回しましたが、エンティティ間のオプションの関係を持つことについて、教義のドキュメントを含め、何も見つかりません。これはよくある状況だと思いました。