Doctrine ORM为您提供了mysqli_fetch_object +一些自定义代码的功能吗?

时间:2016-10-21 14:24:13

标签: php mysqli orm doctrine-orm

很惊讶我还没有看到这个问题。

Doctrine' getResult()MySQLi's mysqli_fetch_object之间的区别是什么?

我使用Doctrine来将表行转换为对象。但mysqli_fetch_object +几行代码可以为我做同样的事情并且效率更高。

从我看来,Doctrine ORM是一个图书馆,为你做了很多繁重的工作,并且有一些额外的好处。所有的好处是什么,我不确定。我一直在使用它们中的一些。我开始使用ORM,认为它太棒了,但它意识到它的重量是多么重。

我开始研究mysqli并看到有一个fetch_object。那嘿嘿嘿? Doctrine做得更好?我看到的唯一的好处是

  • 数据库引擎独立性
  • 自动装箱 - 取消装箱(表格行< =>对象)
  • 关联和更新关联中的数据库SQL
  • 使用persist()
  • 时自动转义

一些实际很酷的特权是:

  • 自动将数据库的任何更改自行保留到数据库(如果对象是" managed"
  • 缓存请求,因此如果您使用相同的SQL 1000次访问数据库,它只会访问数据库一次

以上所有内容都很棒,但我不确定它们是否足以继续使用ORM ....

对于这个答案,我正在寻找一些我可能错过的东西。当我可以声明一个对象并让mysqli_fetch_object进行转换工作时,为什么会有一个ORM怪物?

注意:我可以看到答案说mysqli_fetch_object是将表行转换为对象的单一方法,而Doctrine ORM是所有。我正在寻找更多答案...... Doctrine ORM为您提供了mysqli_fetch_object不能提供的内容。

我正在考虑停止使用Doctrine并寻找任何我可能后悔这样做的理由。

代码

显示一些代码

/* 
 * Both return an object of class Product
 * 
 * one uses mysqli
 * one used ORM
 */
$r = new Repository();

//outputs product model using MySQLi
//0.130990 sec for 10 runs (XDEBUG + Qcachegrind)
var_dump($r->getProductInfo(1)->getModel());   

//outputs product model using ORM
//3.431963 sec for 10 runs (XDEBUG + Qcachegrind)
var_dump($r->getORMProductInfo(1)->getModel());

//if I run above in a loop some 1000+ times, 
//ORM caches my query and hits DB only once
//while MySQLi has no caching set up
//hence ORM outperforms MySQLi when tests are run with multiple same queries

存储库

class Repository extends GenericRepository
{

    /* 
     * MySQLi with some custom code I wrote
     */
    function getProductInfo(int $productId)
    {
        $sql = "
            SELECT model FROM product WHERE id = ?
            ";
        $result = $this->getLink()->paramQuery($sql, $productId);
        return $result->getSingleObject(Product::class);
    }

    /*
     * Doctrine ORM
     */
    function getORMProductInfo(int $productId)
    {
        return $this->getEntityManager()->find(Product::class, 1);
    }
}

MySQLi结果类

class MySqlResult
{

    /**
     * Get single object
     */
    function getSingleObject(string $className)
    {
        return $this->result->fetch_object($className);
    }
}

产品

/**
 * Product
 *
 * @Table(name="product")
 *
 * @Entity
 */
class Product
{

    /**
     *
     * @var integer @Column(name="id", type="integer", nullable=false)
     *      @Id @GeneratedValue
     */
    private $id;

    /**
     *
     * @var string @Column(name="model", type="string", length=100, nullable=false)
     */
    private $model;
}

0 个答案:

没有答案