Doctrine2 はいつ ArrayCollection をロードしますか?
count や getValues などのメソッドを呼び出すまで、データはありません
。これが私のケースです。次のように、Promotion Entity と OneToMany (双方向) の関係を持つ Delegation エンティティがあります。
プロモーション.php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class Promotion
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Delegation", inversedBy="promotions", cascade={"persist"})
* @ORM\JoinColumn(name="delegation_id", referencedColumnName="id")
*/
protected $delegation;
}
Delegation.php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class Delegation
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="Promotion", mappedBy="delegation", cascade={"all"}, orphanRemoval=true)
*/
public $promotions;
public function __construct() {
$this->promotions = new \Doctrine\Common\Collections\ArrayCollection();
}
}
今、私は次のようなことをします(特定の委任で)
$promotion = new Promotion();
$promotion = new Promotion();
$promotion->setDelegation($delegation);
$delegation->addPromotion($promotion);
$em->persist($promotion);
$em->flush();
データベースへの関係を探すことは問題ありません。delegation_id が正しく設定されたプロモーション行があります。
$delegation->getPromotions() を要求すると、空の PersistenCollection が返されますが、コレクションのメソッド ($delegation->getPromotions()->count() など) を要求すると、すべてがよし、ここから。番号を正しく取得します。その後、$delegation->getPromotions() を要求すると、PersistenCollection も正しく取得されます。
なぜこうなった?Doctrine2 はいつコレクションをロードしますか?
例:
$delegation = $em->getRepository('Bundle:Delegation')->findOneById(1);
var_dump($delegation->getPromotions()); //empty
var_dump($delegation->getPromotions()->count()); //1
var_dump($delegation->getPromotions()); //collection with 1 promotion
私はプロモーションを直接要求することができます-> getValues()、そしてそれは大丈夫ですが、何が起こっているのか、そしてそれを修正する方法を知りたいです.
インフルエンザがここで説明しているように、Doctrine2 はほとんどすべての場所で遅延読み込みに Proxy クラスを使用します。ただし、$delegation->getPromotions() にアクセスすると、対応するフェッチが自動的に呼び出されます。
var_dump は空のコレクションを取得しますが、たとえば foreach ステートメントで使用すると、問題なく動作します。