我正在尝试使用方法 ArrayCollection::contains 来查找对象是否已经在我的集合中,但是当我这样做时:
//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 是实体 Role 拥有的仅有的两个属性,我希望它会返回 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::contains,而是:
在相等的情况下比较两个学说实体的标准是什么?
最佳答案
我自己找到了解决方案,这里是给有同样问题的人:
我正在使用方法 ArrayCollection::exists 而不是 contains,所以我可以指定应该建立对象之间的相等性的标准:
以我为例:
$result = $lesRoles->exists(function($key,$element) use ($role)
{
return ($element->getRleApplication() == $role->getRleApplication() && $role->getRleId() == $element->getRleId());
});
注意这里的 $key 和 $element 是从集合中测试的当前对象。
关于PHP 教义 : Test if an object is in an ArrayCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35625149/