Zend framework2 水合数据库

Zend framework2 水合数据库,zend-framework2,Zend Framework2,我对学习和理解水合作用是新的,只是想首先指出这一点。我目前能够选择和插入查询,没有任何问题 我现在一直在尝试更新查询。在我的实体中,我为数据库中的每种类型的列设置了get/set选项。我发现ObjectProperty()函数也最适合我的情况 然而,每当我试图只更新一组列并通过数据库提取时,我就会收到错误,因为所有其他选项都没有设置,并且返回空值。我不需要更新特定行的所有内容,只需要更新几列 例如,在我的DB表中,我可能有: 名字 电话号码 电子邮件地址 但我只需要更新电话号码 $entit

我对学习和理解水合作用是新的,只是想首先指出这一点。我目前能够选择和插入查询,没有任何问题

我现在一直在尝试更新查询。在我的实体中,我为数据库中的每种类型的列设置了get/set选项。我发现ObjectProperty()函数也最适合我的情况

然而,每当我试图只更新一组列并通过数据库提取时,我就会收到错误,因为所有其他选项都没有设置,并且返回空值。我不需要更新特定行的所有内容,只需要更新几列

例如,在我的DB表中,我可能有:

  • 名字
  • 电话号码
  • 电子邮件地址
但我只需要更新电话号码

$entity_passport = $this->getEntityPassport();
$entity_passport->setPrimaryPhone('5551239876');

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => '1'
));
这将返回一个错误,因为此更新中不包括setName()和setEmailAddress(),并且查询返回的值不能为null。但很明显,当您查看DB表时,数据已经存在。那里的数据也不需要更改,只有在本例中PrimaryPhone()号码才需要更改

我一直在到处寻找和阅读文档,但我找不到任何可以解释我做错了什么的东西。我应该注意,我只使用Zend\Db(而不是Doctrine)

我想我错过了一些东西,因为我对这个新功能缺乏了解,我正在努力理解


也许您不需要更新查询。。。我有点迷路了。任何帮助都将不胜感激。谢谢大家!

我认为你对水合作用有一个基本的误解。水合器只是从数据中填充实体对象(水合)并从实体对象中提取数据(提取)。因此,对于不同类型的查询,没有单独的水合器

在更新示例中,您应该首先检索完整的实体对象($entity\u passport),然后将其传递给TableGateway的更新方法。您将通过employeeid检索实体,因为这是您用于更新的条件。比如说:

$entity_passport = $passportMapper->findByEmployeeId(1);
$entity_passport->setPrimaryPhone('5551239876');

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => $entity_passport->getId()
));
这是假设您有某种映射器图层。否则,您可以使用passport TableGateway(我假设getTablePassport()返回的就是这个,不是吗?)

否则,如果您认为检索对象的开销太大,并且只想运行查询,则可以只使用\Zend\Db\Sql\Sql对象,即:

$sql =  new \Zend\Db\Sql\Sql($dbAdapter);
$update = $sql->update('passport')
->set(array('primary_phone' => $entity_passport->getPrimaryPhone()))
->where(array('employeeid' => $employeeId));
编辑: 可能是一个错误,因为它可能会引起更多的混乱。您只需使用TableGateway检索实体对象,然后检索返回的行:

$rows = $this->getTablePassport()->select(array('employeeid' => 1));
$entity_passport = $this->getHydrator($rows->current());
[...]
编辑2: 我检查了你的要点,注意到了一些事情,所以我们开始:

我看到您的getTablePassport确实返回了一个对象,它是TableGateway的一个子类。您已经设置该类,使其使用一个集合。这意味着您在使用网关检索对象时不需要手动补水。 您已经在同一个类中实现了一个搜索方法,那么为什么不直接使用它呢?但是我会改变这个方法,因为现在每个列都使用LIKE。它不仅效率很低,而且还会给您错误的结果,例如在id列上

如果要修复该方法,则只需在服务对象中调用它:
$this->getTablePassport->Search(数组('employeeid'=>1))

否则,您可以在tablegateway类中实现一个单独的方法,例如

public function findByEmployeeId($employeeId)
{
  return $tableGateway->select(array('employeeid' => $employeeId));
}

这应该已经返回了一个实体数组(或者在这种特定情况下返回一个)。另外,在检索实体时,请确保调试并检查实际返回的内容。因此,在尝试更新之前,请打印从PassportTable返回的实体。您首先必须确保检索代码工作正常。

是的,这对我来说还是很新的,所以我处于一种困惑的状态。你的答案确实有用。但是如果你能帮我一个忙,让我看看$passportMapper->FindByeEmployeeID(1)是什么;看起来这会很有帮助。我假设这是TableGateway中的一个函数,它进行了一些选择?太接近了!也许这会有更多帮助这是我的Passport实体、Passport表和我正在尝试进行的更新的要点。当我运行这个时,我不再收到任何错误,我可以看到更新查询正在工作,除了它将SecondaryPhone设置为null。所以我肯定错过了最后一点。也许你能看到一些我看不到的东西。如果我做了
$this->getHydrator($result)->extract($entity)
,那么我看到SecondaryPhone已设置,但其他所有内容都为空。是的,我应该从TableGateway中删除搜索。这是针对分页者的,与本主题无关。我的错!然而,在重新阅读所有内容后,它终于点击了!谢谢你一直支持我。现在一切都好了=)太棒了,很高兴我能帮上忙!