只需进行等级设置: CakePHP 3引入了实体对象,它可以将ORM(数据库)记录表示为对象而不是数组。从原始数据创建对象称为" hydration"。这有利有弊,取决于你想要达到的目的,所以CakePHP为你提供了通过hydrate()函数控制水合作用的选项,该函数可以在查询中链接。
我所观察到的只是顶级结果是水合的;嵌套结果不是。所以如果我的查询是这样的:
$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 消息实体。
以下是结果的渲染:
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)
因此,如果我的假设是正确的,那么只有多个关联作为实体数组返回,问题是,我怎样才能获得belongsTo(以及可能hasOne,我倾向于不使用)包含的数据显示为Entity& #39;?的
答案 0 :(得分:0)
传递到视图中的数据确实包含嵌套实体,由调试器验证。我在Cake工具栏中使用变量查看器来查看结构,该视图将嵌入的实体报告为数组。基于该数据,我使用[“数组语法”]进入结构,但Cake实体足够聪明,可以拦截并转换为get()调用。