Symfony 2.7 findOneBy() 函数找到错误的实体



我有一个控制器操作,它应该在集合中查找半重复的条目,并将它们从该实体的列表中删除。 新的应该还没有 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/>";
     ...

输出

号技术员没有身份证,试图找到一个有
身份证的人 找到已经有 ID 7 的技术员 Khjvuov

可能这不是 findOneBy() 问题。

如果没有add/delete调用它就可以工作,它可能是由ArrayCollection的当前指针修改引起的,所以当调用$tech->getFirstName()时,它实际上指向另一个条目。

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

$iterator = $entity->getTechnicians()->getIterator();
while ($iterator->valid()) {
  $tech = $iterator->current();
  ... $entity->addTechnician()/$entity->removeTechnician()
  $iterator->next();
}

它将创建新的 ArrayIterator 对象,因此您可以修改保留 ArrayCollection 内部指针的基础对象。

如果您运行的是 PHP7,这可能已经过时(参考 - 注释框)

最终,findOneBy()方法使用教义ORM的load()方法。

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

@param array $criteria The criteria by which to load the entity.

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

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

相关内容

  • 没有找到相关文章

最新更新