【发布时间】:2016-02-11 16:00:17
【问题描述】:
只是为了水平设置: CakePHP 3 引入了实体对象,它可以将 ORM(数据库)记录表示为对象而不是数组。从原始数据创建对象称为“水合”。这有利有弊,具体取决于您要实现的目标,因此 CakePHP 为您提供了通过 hydra() 函数控制水合作用的选项,该函数可以链接在查询中。
我观察到只有顶级结果是水合的;嵌套结果不是。所以如果我的查询是这样的:
$authors=$this->Authors->find("all")->contain("Books");
$this->set("authors",$authors);
将返回类似于
的内容authors (array) << This is an array since we can have multiple records
0 (object) <<< This is the Entity object representing the first Author
id 1
name "Roger Kaplan"
[other author fields]
books (array) <<< This is an array because there are multiple books
0 (array) <<< I expect this to be an entity object!!
id 100
title "CakePHP Made Easy"
[other book fields]
1 (array) <<< I want this to be an entity too
id 101
title "Solving Java-induced Neuroses"
[other book fields]
是否也可以对嵌套实体进行水合?
我问的原因是我正在构建希望传递实体对象的助手,并使用实体对象上的元数据来做有趣的事情。我希望能够传递嵌套记录以及顶级记录。
编辑: 我刚刚注意到的是,belongsTo 关联,它只包含一条记录,将作为一个值数组(即不是实体)插入,而 hasMany 关联将返回一个实体数组。这是我实际项目的转储;为了清楚起见,我尝试对其进行编辑:
$message = $this->Messages->find("all")->where(["Messages.id" => $message_id])->contain(["MessageBodies","JobOrders","Candidates"])->first();
消息 belongsTo 候选人和 JobOrders,并且 hasMany MessageBodies。
这是结果的渲染:
message(array)
id 1
job_order_id 2
candidate_id 1
candidate(array)
id 1
first_name Roger
last_name Kaplan
job_order(array)
id 2
name Chief Cook and Bottle Washer
message_bodies(array)
0(object)
1(object)
2(object)
因此,如果我的假设是正确的,即只有 hasMany 关联作为实体数组返回,那么问题是,我如何才能让 belongsTo(可能还有 hasOne,我倾向于不使用)包含的数据显示为实体的?
【问题讨论】:
-
这很奇怪,因为通常嵌套的实体也是水合的。
-
这是您的实际代码还是只是一个示例?
-
只是一个例子。我不想发布我的“真实”代码,因为它需要我的架构和数据库信息的背景,所以我使用了教程中的架构。但我想我刚刚注意到了一些我将添加到问题中的内容。hasMany 关系似乎返回了一个实体数组,而 belongsTo 则返回了一个数组中的单个记录。
-
您的假设不正确。默认情况下,所有关联都被水合。所以要么你遇到了一个错误,要么你的应用程序中有一些东西阻止了水合作用,或者之后使这些特定的关联脱水。然而,在没有看到所有相关代码的情况下,人们所能做的就是在黑暗中射击。
-
好的,我想我明白了我的困惑的根源。正如调试器所验证的那样,传递到视图中的数据确实包含嵌套实体。我使用 Cake 工具栏中的变量查看器来查看结构,该视图将嵌入的实体报告为数组。基于该数据,我使用 ["array syntax"] 进入结构,但 Cake 实体足够聪明,可以拦截并转换为 get() 调用。
标签: cakephp-3.0