2

OK、次のようなユーザーエンティティがあります

<?php
class User 
{
    /**
     * @var integer
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     */
    protected $id;
    /**
     * @var \Application\Entity\Url[]
     * @OneToMany(targetEntity="Url", mappedBy="user", cascade={"persist", "remove"})
     */
    protected $urls;
    public function __construct()
    {
        $this->urls = new \Doctrine\Common\Collections\ArrayCollection();
    }
    public function addUrl($url)
    {
       // This is where I have a problem
    }
}

さて、私がしたいのは、を永続化する前に、ユーザーがすでににあるかどうかを確認する$urlこと$urls ArrayCollectionです$url

今私が見つけた例のいくつかは、私たちが次のようなことをすべきだと言っています

if (!$this->getUrls()->contains($url)) {
    // add url
}

ただし、これは要素の値を比較するため、機能しません。に$urlidまだ価値がないため、これは常に失敗し、$url重複します。

ですから、誰かが要素を永続化せずにArrayCollectionに追加し、重複を回避する方法を説明していただければ幸いです。

編集

私はこれを介してこれを達成することができました

$p = function ($key, $element) use ($url) 
{ 
    if ($element->getUrlHash() == $url->getUrlHash()) { 
        return true; 
    } else { 
        return false; 
    } 
};

しかし、これでもすべてのURLが読み込まれ、チェックが実行されませんか?ユーザーごとに数千のURLが存在する可能性があるため、これは効率的ではないと思います。

4

2 に答える 2

2

これは、「ドメイン駆動」の方法ではまだ可能ではありません。オブジェクトを使用するだけです。クエリを実行して、存在を確認する必要があります。

SELECT count(u.id)FROM User u WHERE?1 IN u.urls AND u.id =?2

Doctrine 2.1では、これは2つの新機能の組み合わせを使用して可能になります。

  1. エクストラレイジーコレクション
  2. コレクションの場合は@IndexByなので、@ OneToMany(targetEntity = "Url"、indexBy = "location")を定義します。
  3. ExtraLazyコレクション->contains()を使用したインデックスのサポート。

ポイント1と2はすでにDoctrine2マスターに実装されていますが、3はまだ欠落しています。

于 2011-02-14T23:18:24.790 に答える
1

コレクションでexistsメソッドを使用して、値を手動で比較してみてください。

于 2011-01-31T03:57:56.410 に答える