4

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 ステートメントで使用すると、問題なく動作します。

4

1 に答える 1

5

呼び出し$delegation->getPromotions()は、初期化されていないオブジェクトのみを取得しDoctrine\ORM\PersistentCollectionます。そのオブジェクトはプロキシの一部ではありません (読み込まれたエンティティがプロキシの場合)。

Doctrine\ORM\PersistentCollectionこれがどのように機能するかについては、 の API を参照してください。

基本的に、コレクション自体は、実際のラップされたオブジェクトのプロキシ (この場合は値ホルダー) であり、メソッドが呼び出されるArrayCollectionまで空のままです。PersistentCollectionまた、ORM は、EXTRA_LAZY特定の操作 (アイテムの削除や追加など) をコレクションに適用しても読み込まれないように、コレクションが としてマークされているケースを最適化しようとします。

于 2013-01-29T08:28:56.467 に答える