什么是 Doctrine 水合作用? [关闭]

Posted

技术标签:

【中文标题】什么是 Doctrine 水合作用? [关闭]【英文标题】:What is Doctrine hydration? [closed] 【发布时间】:2011-02-09 08:16:34 【问题描述】:

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

谁能解释一下?

【问题讨论】:

Doctrine2 文档参考解释了 HYDRATION:doctrine-project.org/docs/orm/2.0/en/reference/… 没有建设性?这是了解 Doctrine 内部如何运作的最基本概念之一。 我认为这个问题应该受到保护而不是关闭。 @Simon 同意。问题和接受的答案都很受欢迎,为什么不把它移到 protected 状态呢? 【参考方案1】:
$q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

它将只返回一个简单的数组,而不是一个学说集合对象。

【讨论】:

【参考方案2】:

Hydration 是一种用于返回查询结果的方法。例如:

    HYDRATE_ARRAY - 这将返回一个由另一个数组表示的记录数组:

    $q = Doctrine_Query::create()
       ->from('Post p')
       ->setHydrationMode(Doctrine::HYDRATE_ARRAY);
    
    $resultSet = $q->execute(); // $resultSet is an array
    
    foreach ($resultSet as $post) 
        // $post is an array
        echo $post['title'];
    
    

    HYDRATE_RECORD - 这将返回一个对象集合 (Doctrine_Collection):

    $q = Doctrine_Query::create()
       ->from('Post p')
       ->setHydrationMode(Doctrine::HYDRATE_RECORD); // Unnecessary, HYDATE_RECORD is default method
    
    $resultSet = $q->execute(); // $resultSet is an Doctrine_Collection object
    
    foreach ($resultSet as $post) 
        // $post is an Post object
        echo $post->getTitle();
        echo $post['title']; // Each Doctrine's Model object implements ArrayAccess interface so this is possible
        echo $post->myCustomMethod();
    
    

    HYDRATE_SINGULAR_SCALAR - 将返回查询结果第一列的值:

     $q = Doctrine_Query::create()
       ->select('p.created_at')
       ->from('Post p')
       ->where('p.id = ?', 321)
       ->setHydrationMode(Doctrine::HYDRATE_SINGULAR_SCALAR); 
    
    $createdAt = $q->execute(); // $createdAt has value of first column from first record from result set (eg.: 2008-04-06 21:22:35)
    

还有更多方法,您可以在文档中阅读每个方法。

【讨论】:

ok..所以通常当我使用 sql 时它会返回一个 mysql 对象,我必须使用 mysqli_fetch_assoc,然后自己对它们进行排序等等......但现在它已经为我排序了。这就是水合作用,给我排序的对象/数组? 不,这与排序结果无关(orderBy() 处理此问题)。它是关于您的查询结果是什么,它是单个标量值 (HYDRATE_SINGULAR_SCALAR)、嵌套数组表示每个数据库记录 (HYDRATE_ARRAY) 的数组还是数组的集合对象 (HYDRATE_RECORD)。对每种补水模式的查询结果执行var_dump - 这是查看“它是如何工作的?”的最佳方式 只是一个小提示。在 1.2 中,HYDRATE_SINGULAR_SCALAR 返回未定义的常量错误。 HYDRATE_SINGLE_SCALAR 是对的。 作为注释Doctrine::HYDRATE_RECORD 现在称为Doctrine::HYDRATE_OBJECT 上述文档的链接将使这个答案更有帮助。

以上是关于什么是 Doctrine 水合作用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 仅从本机查询中水合物单行

在教义2中使用部分对象语法+数组水合器为字段别名

原则 1.2:禁用缓存

Doctrine + Oracle = 超出最大打开游标 (ORA-01000)

使用自定义 Doctrine 2 hydrator 进行依赖注入

使用自定义 Doctrine 2 数据类型的依赖注入