Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP原则:测试对象是否在ArrayCollection中_Php_Doctrine Orm_Contains_Equality_Arraycollection - Fatal编程技术网

PHP原则:测试对象是否在ArrayCollection中

PHP原则:测试对象是否在ArrayCollection中,php,doctrine-orm,contains,equality,arraycollection,Php,Doctrine Orm,Contains,Equality,Arraycollection,我试图使用ArrayCollection::contains方法查找对象是否已在我的集合中,但在执行此操作时: //My ArrayCollection $lesRoles = $drt->getDrtApplication()->getRoles(); $leRole = $lesRoles->first(); echo "Property appNom : ".$leRole->getRleApplication()->getAppNom()."// Prope

我试图使用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));
//我的ArrayCollection
$lesRoles=$drt->getDrtApplication()->getRoles();
$leRole=$LeRoles->first();
echo“Property-appNom:”.$leRole->getRleApplication()->>getAppNom()。“//Property-appRole:“.$leRole->getRleId()”
”; $role=new\Casgaya\role(2,$drt->getDrtApplication()); echo“Property appNom:”.$role->getRleApplication()->>getAppNom()。“//属性批准:”.$role->getRleId()。“
”; var_dump($lesRoles->contains($role));
结果是:
房地产appNom:CORA//房地产appRole:2
房地产appNom:CORA//房地产appRole:2
布尔(假)

由于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());
echo“测试对象角色:
”; 变量转储($lesRoles==$role); 回声“
”; echo“从对象角色测试整数属性rleID:
”; 变量转储($role->getRleId()==$leRole->getRleId()); 回声“
”; echo“从对象角色测试应用程序对象属性:
”; 变量转储($role->getRleApplication()==$leRole->getRleApplication());
结果是:

房地产appNom:CORA//房地产appRole:2
房地产appNom:CORA//房地产appRole:2
测试对象角色:
布尔(假)
从对象角色测试整数属性rleID:
布尔(真)
从对象角色测试应用程序对象属性:
布尔(真)

注意,当我测试这两个属性的相等性时,它们都是真的。但当我测试整个对象的相等性时,它是错误的。

因此,问题不再是关于ArrayCollection::contains,而是:
在平等的情况下,比较两个学说实体的标准是什么?

包含(混合$element) 检查给定元素是否包含在集合中。只比较元素值,不比较键。两个元素的比较是严格的,这意味着不仅值必须匹配,类型也必须匹配对于对象,这意味着引用相等。

资料来源:


若要检查集合中是否包含某个角色,可以通过条令检索该角色—它将返回相同的对象,因为条令通常不会获取已通过另一个查询获取的实体

我自己找到了解决方案,下面是给那些有同样问题的人的:

我使用的方法是ArrayCollection::exists而不是contains,因此我可以指定应根据哪些条件在对象之间建立相等:

就我而言:

$result = $lesRoles->exists(function($key,$element) use ($role) 
{
    return ($element->getRleApplication() == $role->getRleApplication() && $role->getRleId() == $element->getRleId());
});
注意这里$key和$element是从集合中测试的当前对象。我有一个相同的问题:

$Xrepository->removeX($x);
$x->getY()->removeXRelation($x);
removeXXXRelation()
中,我使用
ArrayCollection->contains()

包含()
将失败

经过2个小时的调试和尝试,解决方案如下

$x->getY()->removeXRelation($x);
$Xrepository->removeX($x);
只需翻转移除调用

正如你所看到的,教义正在对这个物体施魔法。
这个魔术从移除调用开始。
一位同事向我介绍了hibernate对象生命周期状态,它解析为:
未持续、持续、不再持续
由于生命周期状态的更改,可能会生成两次对象,使
contains()
变为false(contains检查对象标识)

这就是我的理论(如果我错了,请告诉我)

为什么你认为它会变成真的?您最好创建简单的ArrayCollection,在其中放置一个您想要的角色,并检查集合是否包含该角色(如果您想检查它是如何工作的)。看起来您刚刚创建的$role(role的一个新实例)不能在集合中,因为它刚刚被实例化。这只是一个测试用例,我创建了一个我知道已经在arrayCollection中的对象。它们都有完全相同的属性。你刚刚创建了它,你希望它会在你刚刚初始化的集合中。谢谢你,你帮助我关注了真正的问题。不是ArrayCollection中包含的方法,而是如何建立两个条令实体之间的相等关系。我认为,在测试的情况下,您可以自己比较属性,或者编写一些辅助方法。就教义而言,这是一种魔力。例如,您可以获取一个对象,然后获取包含该对象的某个集合,并且原则应该使用相同的实例引用等式。如果可能的话,该学说使用内存中存在的对象,而不是为新对象补水。检查它是否具有双向关系的转储实体的简单方法:子实体将包含对父实体的引用。