问题标签 [hydration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
46775 浏览

php - 什么是 Doctrine 水合作用?

我在学说的文档中阅读了有关水合作用的内容,但我仍然无法理解它是什么。

有人可以解释一下吗?

0 投票
1 回答
120 浏览

symfony - 使用与外键共享主键的一对一关系中的用户对象

过去曾多次提出过这个问题,但这带来了独特的挑战,因为它将一些问题结合在一个更大的问题中。

我有一个实体(用户)在我的应用程序中用作用户类,然后我有另一个实体(UserExtra),与用户实体一对一关系,UserExtra 的 id 与 User 相同。外键与主键相同。

当加载用户对象时(比如 by$this->getUser()或 by {{ app.user }},UserExtra 数据也通过连接加载。拥有两个实体的全部意义在于我不必一次加载所有数据。

我什至尝试为用户定义一个自定义 UserLoaderInterface/UserProviderInterface 存储库,确保 refreshUser 和 loadUserByUsername 只会加载用户数据(我希望 UserExtra 数据位于代理中,除非我明确需要它)但是当 Doctrine 去水合对象,它发出一个额外的查询来加载 UserExtra 数据,从而跳过代理状态。

有没有办法解决这个问题?

0 投票
0 回答
454 浏览

php - Doctrine2 + ZF2:通过连接表与元数据建立多对多关联的实体

我有两个实体RentalItem. Items 通过包含一些元数据的连接表与 s 相关联Rental,因此连接表实际上成为了第三个实体RentedItem

因为 aRentedItem可以通过其关联的Rentaland来识别Item,所以它不需要自己的 ID,而是使用由这两个外键组成的复合键作为主键。

Rental可以通过 RESTful API 创建或更改A ,包括它的一些相关对象。相应的控制器使用DoctrineObjectZF2 DoctrineModule 的 hydrator 使用给定的表单数据对出租对象进行水合。新数据作为表单数组传递给 hydrator

通常,水合器会正确设置引用,即使对于全新的实体和新关系也是如此。然而,由于这种复杂的关联,水合作用Rental失败了。编码

失败,但出现以下异常

我是否必须手动设置租用物品的参考资料?或者这可能是由错误的配置或其他原因引起的?

0 投票
3 回答
1776 浏览

doctrine-orm - Doctrine fetch join 无法正确补水

原始问题

我正在 Doctrine 中进行获取连接,使用具有复合键且没有其他定义字段的连接表,并将不正确的数据加载到我的实体中。这是 Doctrine 中的错误,还是我做错了什么?

下面是一个简单的例子来说明这个问题。

创建三个实体:




使用此数据填充相应的数据库表:


使用此代码水合Driver实体并显示其内容:


预期输出:

John Doe:
宝马 7 系
Crysler 300
道奇 Dart
梅赛德斯 C 级
沃尔沃 XC90


实际输出:

John Doe:
宝马 7 系
道奇 Dart
道奇 Dart
沃尔沃 XC90
沃尔沃 XC90

相关实体在这里发生了奇怪的重复。具体而言,子实体#3被复制为#2,#5被复制为#4等,子实体#2、#4等根本不加载。这种模式是一致的和可重复的。

我的代码有问题吗?为什么 Doctrine 无法正确地将数据库表中的数据映射到实体?

附加说明

如果查询所有游乐设施(即司机和汽车之间的关联)并执行 fetch-join,则会出现同样的问题。这是一个重要案例,因为@qaqar-haider 的回答不适用于这种情况。

假设下表数据


想象一下带有 fetch-joins 的以下查询


预期输出:

John Doe:克莱斯勒
John Doe:梅赛德斯
John Doe:宝马
Erika Mustermann:宝马
Erika Mustermann:克莱斯勒


实际输出:

John Doe:克莱斯勒
John Doe:梅赛德斯
John Doe:梅赛德斯
Erika Mustermann:宝马
Erika Mustermann:宝马

再一次,结果的数量是正确的,但关联是混乱的。

这是原始问题的简化测试用例,不受任何 WHERE 或 GROUP BY 子句的约束。

0 投票
1 回答
36 浏览

class - ZF2:如何将水合为两个不同的类别

我对 Zend Framework 2 很陌生,所以我想就水合作用的疑问寻求您的帮助:

我有一个 ResultSet,我正在为运输方式补充水分 - 其中大多数是标准运输方式,但也有一些自定义运输方式,通过列在表格中标识。

我现在想将标准的水合到 ShippingMethod 对象中,但将自定义的水合到其他类的对象中。

我可以请你指出我正确的方向吗?

提前致谢!

0 投票
2 回答
544 浏览

php - Doctrine DBAL ->execute() 和 Hydration,DB2 字段名称包括“#”

我正在尝试使用 Doctrine DBAL 实现模型/映射器类型的交互,但遇到了一些问题。我的一些列名末尾有一个“#”。更改名称不是一种选择。${'COL1#'} 语法适用于常规变量,但 PHP 似乎很难将其用作对象属性。

解析错误:语法错误,意外的“$”,期望变量(T_VARIABLE in...

如何为字段名称中带有井号标签的表创建模型?

0 投票
0 回答
234 浏览

php - 有没有办法在不循环两次结果集的情况下对对象进行水合?

如果我使用 Hydrator 将我的查询结果的值放入我的模型的一个实例中,我将不得不循环两次结果(一次用于水合每一行/对象,然后在我实际使用结果时再次)。

我知道有多种PDO_FETCH_*模式,例如FETCH_INTOFETCH_CLASS似乎可以实现相同的功能。我能看到的唯一区别是在水合过程中操纵数据的潜力。

我只是想弄清楚当它们需要对结果集进行额外迭代时使用水合器的原因。我觉得必须有一些理由或方法来使额外的迭代可以接受,我很好奇它是什么。我不确定为什么像 hydrators 这样的编程模式如此流行,因为从表面上看,在大多数情况下它似乎是一种浪费。在水合期间操纵数据是使用水合器的唯一原因吗?

映射器的“查找全部”方法:

($this->hydrator是 的一个实例Zend\Stdlib\Hydrator\ArraySerializable,但为了这个问题的目的,可以用任何其他水合器代替。)

0 投票
1 回答
111 浏览

php - 在隔离包中注册 Symfony Hydrators

我创建了几个共享 Bundle 的模块化应用程序。其中一个包负责处理所有实体/存储库相关的逻辑(我们称之为 MyBundle)。

这个 MyBundle 包含几个自定义水合器。鉴于教义配置包含在特定应用程序中,并且我不希望在其 config.yml 文件中注册捆绑包水合器,我如何在包中注册这些水合器?

我尝试在我的包中创建一个 CompilerPass,然后在学说 orm 配置服务上调用 addCustomHydrationMode 但这不起作用。

我还尝试创建一个“HydrationManager”类,注入实体管理器,然后在编译器传递中调用管理器上的 addHydrator 方法,该方法又调用 getConfiguration()->addCustomHydrationMode(...) 但这也不起作用

0 投票
1 回答
268 浏览

forms - 水合多个对象zf2

我需要以一种形式对多个对象进行水合。这是我使用的:

  • 产品表格 - 我有一个表格,我称之为三个字段集
  • 产品字段集
  • 促销字段集
  • 类别字段集

我有所有必要表格的模型,这是产品模型的示例:

在我的控制器中,我想将数据绑定到我的视图,以便我可以编辑它们。

首先,我需要从数据库中选择所有必要的信息。我加入了三个表产品、促销和类别表。我必须将数据作为对象返回到我的控制器并将它们绑定到我的表单中,以便能够在视图页面上进行编辑。

请给我一些想法如何实现这一点,以便我可以继续我的开发。我被困住了。

我将感谢所有可以帮助我或给我现实生活中的任何想法/示例的链接。

我需要对结果进行水合并返回一个对象,我将在控制器中使用它来绑定表单。

0 投票
2 回答
321 浏览

php - 模型中的 ZF2 属性名称与数据库列不对应

我有一个User model包含一些属性 - 比如说firstName and lastName- 但在我的数据库中我将​​它们存储为first_name and last_name.

在里面User Form我使用这样的保湿剂:

调试显示:

为什么数组键与数据库列不匹配,即使我使用$this->setHydrator(new ClassMethods(true));