Хорошо, у меня есть объект пользователя следующимDoctrine2 ArrayCollection
<?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;
}
};
Но не это по-прежнему загружать все URLs, а затем выполняет проверку? Я не думаю, что это эффективно, поскольку на пользователя может быть тысячи URL-адресов.
Итак, как вы думаете, это хорошая идея создать 'UrlService' с' addUrl ($ url, $ user) 'метод, где будет использоваться DQL, до тех пор, пока не исчезнет доктрина 2.1?Я предполагаю, что использование DQL в сущности невозможно/хорошая идея. – Optimus
или, может быть, 'UrlService :: checkIfExists ($ url, $ user)' и запустить DQL в этом методе? – Optimus