Хорошо, у меня есть объект User следующим образом
<?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-адресов.