PHP Doctrine: проверить, находится ли объект в ArrayCollection

Я пытаюсь использовать метод ArrayCollection :: Содержит, чтобы найти, если объект уже находится в моей коллекции, но когда я делаю:

//My ArrayCollection
$lesRoles = $drt->getDrtApplication()->getRoles();
$leRole = $lesRoles->first();
echo "Property appNom : ".$leRole->getRleApplication()->getAppNom()."// Property appRole : ".$leRole->getRleId()." <br>";$role = new \Casgaya\Role(2,$drt->getDrtApplication());
echo "Property appNom : ".$role->getRleApplication()->getAppNom()."// Property appRole : ".$role->getRleId()." <br>";

var_dump($lesRoles->contains($role));

Результат:
Свойство appNom: CORA // Свойство appRole: 2
Свойство appNom: CORA // Свойство appRole: 2
BOOL (ложь)

Поскольку appNom и rleId — это единственные два свойства, которыми владеет ролевая сущность, которую я прыгал, она вернет true.

РЕДАКТИРОВАТЬ НОВЫЙ ИСПЫТАТЕЛЬНЫЙ СЛУЧАЙ:

echo "Test object role :  <br>";
var_dump($lesRoles==$role);
echo"<br>";
echo "Test integer property rleID from object role :  <br>";
var_dump($role->getRleId() == $leRole->getRleId());
echo"<br>";
echo "Test Application object property RleApplication from object role : <br> ";
var_dump($role->getRleApplication() == $leRole->getRleApplication());

Результат:

Свойство appNom: CORA // Свойство appRole: 2
Свойство appNom: CORA // Свойство appRole: 2
Роль тестового объекта:
BOOL (ложь)
Проверьте целочисленное свойство rleID из роли объекта:
BOOL (истина)
Проверить свойство объекта приложения RleApplication из роли объекта:
BOOL (истина)

Обратите внимание, что когда я проверяю равенство двух свойств, оба они верны. Но когда я проверяю равенство обоих объектов, это ложь.

Таким образом, вопрос больше не о ArrayCollection :: Содержит, но это:
По каким критериям сравниваются две доктрины в случае равенства?

4

Решение

Я нашел решение для себя, вот для людей, которые имеют ту же проблему:

Я использую метод ArrayCollection :: exist вместо Содержит, поэтому я могу указать, по каким критериям должно быть установлено равенство между объектами:

В моем случае :

$result = $lesRoles->exists(function($key,$element) use ($role)
{
return ($element->getRleApplication() == $role->getRleApplication() && $role->getRleId() == $element->getRleId());
});

Обратите внимание, что здесь $ key и $ element — текущий объект, протестированный из коллекции.

5

Другие решения

содержит (смешанный элемент $)
Проверяет, содержится ли данный элемент в коллекции. Сравниваются только значения элементов, а не ключи. Сравнение двух элементов строгое, это означает, что должно совпадать не только значение, но и тип. Для объектов это означает равенство ссылок.

источник:
http://www.doctrine-project.org/api/common/2.1/class-Doctrine.Common.Collections.ArrayCollection.html

Если вы хотите проверить, содержится ли какая-либо роль в коллекции, вы можете извлечь ее с помощью Doctrine — она ​​вернет тот же объект, потому что Doctrine обычно не извлекает объекты, которые уже получены с помощью другого запроса.

3