2017-04-26 3 views
2

関連エンティティをフェッチしません、私はそれがどのように見えるか、ここに、symfonyのドキュメントからの例でそれを再現しましたProductクラス教義OneToManyの関係は、私はこのケースで立ち往生しています

/** 
* @ORM\Entity 
*/ 
class Product 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="products") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

    public function __construct($category) 
    { 
     $this->category = $category; 
    } 

    public function id() 
    { 
     return $this->id; 
    } 

    public function category() 
    { 
     return $this->category; 
    } 
} 

TEST

今、私はカテゴリーをフェッチし、その製品を入手できるようにしたいテストコードのこのスニペットを持っている:私は取得しています何

$cat = new Category(); 
$prod = new Product($cat); 

$this->entityManager->persist($prod); 
$this->entityManager->persist($cat); 
$this->entityManager->flush(); 

$crepo = $this->getEntityManager()->getRepository(Category::class); 
$c = $crepo->findAll()[0]; 

var_dump(get_class($c->products()), $c->products()->count()) 

が期待されているクラスPersistentCollectionの製品ですが、カウントが0 1製品が必要です。

データベースに適切な外部キーが設定された適切なカテゴリと製品レコードがあることがわかります。

回避策

私は製品にPersistentCollectionをデバッグしていますし、そのフラグが初期化= trueに設定されていることがわかります。これで、私はそれはず、それがどのように動作するかを

$c->products()->setInitialized(false); 
$c->products()->initialize(); 

を呼び出すことによって、しかし、この私の知る限りで動作するように、これを強制することはできませんされていますか?

+0

Doctrineが 'new Product'のコンストラクタを使用すると思われますが、Doctrineでは呼び出されません。http:// docs .doctrine-project.org/projects/doctrine-orm/en/latest/reference/architecture.html#エンティティ – LBA

+0

なぜカスケードを使用しないのですか? [カスケードを理解することは、教義の中で継続する](http://www.inanzzz.com/index.php/post/hry2/understanding-the-cascade-persist-operations-in-doctrine) – BentCoder

+0

応答に感謝します。これらが原因です。 Doctrineがコンストラクタを呼び出して作業を保存するとは期待していないので、カスケードの持続性は関連しないものです。私は何が原因であるのかを突き止め、投稿して答えました –

答えて

0

回答が見つかりました。基本的には動作しますが、同じプロセスで実行される場合は動作しません。スクリプトを2つに分割すると、最初のスクリプトが残っていれば、2番目のデータが取得され、次に商品コレクションにはカテゴリに関連する商品が含まれます。

これは、単一のプロセスで行われたときに、問題のカテゴリが製品を持っていることを知らず、保存した同じオブジェクトを取得し、数行上に作成されたため、データベースを使用してコレクションを移入しますが、カテゴリオブジェクトのコレクションを使用します。また、カテゴリオブジェクトには、Productコンストラクタや他の場所には$this->products()->add($category)のような呼び出しがないため、商品コレクションに商品がありません。それ以来コレクションを再初期化しようとすると強制的にデータベースから商品が取り出されます

関連する問題