【问题标题】:Why to use doctrine relationships vs native query为什么使用学说关系与原生查询
【发布时间】:2014-07-29 00:56:50
【问题描述】:

我有一个简单的问题。我看到一个 Symfony2-Tutorial,博主到处使用没有关系的简单实体,并且还使用学说 native-query 来连接和查询不同的实体。

什么更好,使用学说原生查询或建立每次关系?

你好,迈克尔

【问题讨论】:

    标签: symfony orm doctrine-orm entity-relationship nativequery


    【解决方案1】:

    我认为这取决于结果集的处理方式。例如,假设如下关系:

    一家公司有很多员工 (1:N)

    如果这家公司在每个加载所有要显示的员工数据的请求中执行选择查询时,只需弄清楚如果该公司拥有超过 1 万名员工会产生什么影响。在这种情况下,在模型中创建 lazy 关联可能是一种很好的做法:

    <?php
    
    /**
     * @Entity
     */
    class Company
    {
        /**
         * @OneToMany(targetEntity="Employee", fetch="EXTRA_LAZY")
         */
        public $employees;
    }
    

    在这种情况下,教义只会从数据库中触发所需的数据,因为它知道所有数据都会随着您的请求而逐渐被访问。您可以在教义的文档中阅读有关lazy associations 的更多信息。

    原生查询怎么样?

    本机查询可以将任意 SQL 代码映射到对象,例如高度供应商优化的 SQL 或存储过程。快速的标量结果和更少的内存使用。请注意,复杂的模型关系可能对服务器来说太重而无法操作。比如看这个基于Class Table Inheritance的结构:

    有一个名为Product的超类,并且有200多个不同的子产品从Product扩展而来。每个子产品都存储在其各自的表中。

    <?php 
    
    abstract class Product
    
        protected $name;
    

    一些子产品为例:

    <?php
    
    class Candy extends Product
    
        /** specific property for this product */
        private $sugarLevel;
    

    另一个:

    <?php
    
    class IceCream extends Product
    
        /** specific property for this product */
        private $temperature;
    

    现在,您需要评估仓库中的每个产品。通常,获得此结果的第一个想法是:

    $assess = array();
    $products = $em->getRepository('models\Product');
    foreach ($products as $p)
    {
        //summarize each product by type
        $assets[$p->getType()] = $assets[$p->getType()] + 1;
    }
    
    
    echo "There are " . $assets['candy'] " candies in stock";
    

    这确实是一个繁重的过程,因为我们查询 200 个表只是为了确定每个产品的存在。这可以通过简单的本机查询轻松缓解:

    $query = $em->createNativeQuery('SELECT p.type, count(p.type) as total FROM Product p group by p.type', $rsm);
    $result = $query->getArrayResult();
    
    print_r($result);
    // [0] => array('type' => 'candy', 'total' => 545),
    // [1] => array('type' => 'icecream', 'total' => 344),
    //...
    // [199] => array('type' => 'foo', 'total' => 878),
    

    【讨论】:

    • 好的,清楚。但是这个原生查询有什么好处。应该有人使用它还是使用理论查询语言和/或查询构建器更好?
    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 2018-11-28
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多