Я пытаюсь использовать метод 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 :: Содержит, но это:
По каким критериям сравниваются две доктрины в случае равенства?
Я нашел решение для себя, вот для людей, которые имеют ту же проблему:
Я использую метод ArrayCollection :: exist вместо Содержит, поэтому я могу указать, по каким критериям должно быть установлено равенство между объектами:
В моем случае :
$result = $lesRoles->exists(function($key,$element) use ($role)
{
return ($element->getRleApplication() == $role->getRleApplication() && $role->getRleId() == $element->getRleId());
});
Обратите внимание, что здесь $ key и $ element — текущий объект, протестированный из коллекции.
содержит (смешанный элемент $)
Проверяет, содержится ли данный элемент в коллекции. Сравниваются только значения элементов, а не ключи. Сравнение двух элементов строгое, это означает, что должно совпадать не только значение, но и тип. Для объектов это означает равенство ссылок.
Если вы хотите проверить, содержится ли какая-либо роль в коллекции, вы можете извлечь ее с помощью Doctrine — она вернет тот же объект, потому что Doctrine обычно не извлекает объекты, которые уже получены с помощью другого запроса.