Symfony 函数的作用是:查找错误的实体

Symfony 函数的作用是:查找错误的实体,symfony,doctrine-orm,entity,arraycollection,Symfony,Doctrine Orm,Entity,Arraycollection,我有一个控制器操作,它应该在集合中查找半重复的条目,并将它们从该实体的列表中删除。新的应该还没有ID,而现有的应该有ID,所以我正在运行findOneBy(),其中包含一个要匹配的参数数组(省略ID) 我为我所犯的错误感到困惑和深深困扰,因为它发现了错误的实体!下面我有一些相关的代码,我希望这只是一个梦或者一个愚蠢的错误,我不能在自己的windows开发环境中复制输出,但是我的同事在他的mac上测试,并且出现了错误,所以我在他的机器上做了一些快速回显,看看发生了什么。请参阅下面的代码和结果 代码

我有一个控制器操作,它应该在集合中查找半重复的条目,并将它们从该实体的列表中删除。新的应该还没有ID,而现有的应该有ID,所以我正在运行
findOneBy()
,其中包含一个要匹配的参数数组(省略ID)

我为我所犯的错误感到困惑和深深困扰,因为它发现了错误的实体!下面我有一些相关的代码,我希望这只是一个梦或者一个愚蠢的错误,我不能在自己的windows开发环境中复制输出,但是我的同事在他的mac上测试,并且出现了错误,所以我在他的机器上做了一些快速回显,看看发生了什么。请参阅下面的代码和结果

代码

foreach($entity->getTechnicians() as $tech) {
  //find new addtions, see if they exist
  if (!$tech->getId()) {
    echo "Technician " . $tech->getFirstName() . " has no ID, trying to find one that does<br/>";
    $found = $em->getRepository('TechnicianBundle:Technician')->findOneBy(array(
      'firstName' => $tech->getFirstName(),
      'lastName' => $tech->getLastName(),
      'email' => $tech->getEmail(),
      'residentEngineer' => $tech->getResidentEngineer(),
      'officeNumber' => $tech->getOfficeNumber()
    ));

    //if one with an ID already exists
    if ($found) {
      echo "found technician " . $found->getFirstName() . " that already has id " . $found->getId() . "<br/>";
     ...
foreach($entity->gettechnicans()作为$tech){
//查找新添加,查看它们是否存在
如果(!$tech->getId()){
echo“technology”。$tech->getFirstName()。“没有ID,正在试图找到一个ID是
”; $found=$em->getRepository('TechnicianBundle:technology')->findOneBy(数组( “firstName”=>$tech->getFirstName(), 'lastName'=>$tech->getLastName(), 'email'=>$tech->getEmail(), 'residentEngineer'=>$tech->getResidentEngineer(), 'officeNumber'=>$tech->getOfficeNumber() )); //如果已经存在一个ID为的 如有($已找到){ 回显已具有id的“找到的技师”。$FOND->getFirstName()。“
”; ...
输出

技师Four没有ID,正在尝试查找一个ID为的技师
找到已具有id的技师khjvuov


最后,
findOneBy()
方法使用

在文档中,参数
$criteria
描述如下:

@param array$criteria加载实体所依据的条件。

您可能应该深入研究Doctrine API以确保,但在作为参数传递的数组中,很可能只考虑第一个key=>值对(在您的示例中,'firstName'=>$tech->getFirstName())


如果是这种情况,您可能需要在实体存储库中添加自己的自定义方法,该方法允许您使用更高级的语句查询数据库(例如使用SQL中的
LIKE()

最终,
findOneBy()
方法使用

在文档中,参数
$criteria
描述如下:

@param array$criteria加载实体所依据的条件。

您可能应该深入研究Doctrine API以确保,但在作为参数传递的数组中,很可能只考虑第一个key=>值对(在您的示例中,'firstName'=>$tech->getFirstName())


如果是这种情况,您可能需要在实体存储库中添加自己的自定义方法,该方法允许您使用更高级的语句(例如,使用SQL中的
LIKE()
)查询数据库。

可能这不是findOneBy()问题

如果没有add/remove调用,则可能是由于修改了ArrayCollection的当前指针,因此当调用$tech->getFirstName()时,它实际上指向另一个条目

您可以尝试像这样迭代集合:

$iterator = $entity->getTechnicians()->getIterator();
while ($iterator->valid()) {
  $tech = $iterator->current();

  ... $entity->addTechnician()/$entity->removeTechnician()

  $iterator->next();
}
它将创建新对象,因此您可以修改基础对象,保留ArrayCollection的内部指针


如果您正在运行PHP7(-Note box)

这可能是过时的,可能不是findOneBy()问题

如果没有add/remove调用,则可能是由于修改了ArrayCollection的当前指针,因此当调用$tech->getFirstName()时,它实际上指向另一个条目

您可以尝试像这样迭代集合:

$iterator = $entity->getTechnicians()->getIterator();
while ($iterator->valid()) {
  $tech = $iterator->current();

  ... $entity->addTechnician()/$entity->removeTechnician()

  $iterator->next();
}
它将创建新对象,因此您可以修改基础对象,保留ArrayCollection的内部指针


如果您正在运行PHP7(-Note box)

是否可以发布具有相关属性和getter的实体代码?您的输出是否始终相同(如果您注释掉removeTechnician和addTechnician方法)?您发现了哪些错误?不确定验证程序回调是否相关,因此我将其保留在了中。感谢您的帮助。没有错误,我说错误是错误的,只是错误,因为它没有完成它应该做的事情。将在我的同事测试注释添加/删除/设置方法时更新。再次感谢添加/删除设置的输出要点调用了ers,以及回音中的所有参数。如果没有添加/删除方法,它工作得很好,但有充分的理由,因为它不能像我希望的那样解决软重复。因此,这个问题并没有得到解决,而是完全避免了删除这些调用。@e1darCan您可以发布具有相关属性和getter的实体代码吗您的输出是否总是相同的(如果您注释掉removeTechnician和addTechnician方法)?您发现了哪些错误?不确定验证程序回调是否相关,因此我将其保留在了中。感谢您的帮助。没有错误,我说错误是错误的,只是错误,因为它没有完成它应该做的事情。将在我的同事测试注释添加/删除/设置方法时更新。再次感谢添加/删除设置的输出要点ers被调用,所有参数都在回显中。如果没有添加/删除方法,它工作得很好,但原因很充分,因为它没有像我希望的那样解决软重复。因此,这个问题没有得到解决,而是完全避免了删除这些调用。@e1darIf需要“first key=>value pair”,那么它应该看起来像->findOneBy(数组('firstName'=>'Four')。为什么一个名为“khjvuov”的技术人员是结果呢?也可以用数组表示法findOneBy。是的,它支持数组