Cakephp 3:在查询结果

时间:2016-02-11 16:00:17

标签: cakephp-3.0

只需进行等级设置: 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;?的

1 个答案:

答案 0 :(得分:0)

传递到视图中的数据确实包含嵌套实体,由调试器验证。我在Cake工具栏中使用变量查看器来查看结构,该视图将嵌入的实体报告为数组。基于该数据,我使用[“数组语法”]进入结构,但Cake实体足够聪明,可以拦截并转换为get()调用。