【问题标题】:Cakephp 3: Hydrating nested entities in query resultsCakephp 3:在查询结果中水合嵌套实体
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多