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
}
ただし、これは要素の値を比較するため、機能しません。に$url
はid
まだ価値がないため、これは常に失敗し、$url
重複します。
ですから、誰かが要素を永続化せずにArrayCollectionに追加し、重複を回避する方法を説明していただければ幸いです。
編集
私はこれを介してこれを達成することができました
$p = function ($key, $element) use ($url)
{
if ($element->getUrlHash() == $url->getUrlHash()) {
return true;
} else {
return false;
}
};
しかし、これでもすべてのURLが読み込まれ、チェックが実行されませんか?ユーザーごとに数千のURLが存在する可能性があるため、これは効率的ではないと思います。