很惊讶我还没有看到这个问题。
Doctrine
' getResult()
和MySQLi's
mysqli_fetch_object
之间的区别是什么?
我使用Doctrine来将表行转换为对象。但mysqli_fetch_object +几行代码可以为我做同样的事情并且效率更高。
从我看来,Doctrine ORM是一个图书馆,为你做了很多繁重的工作,并且有一些额外的好处。所有的好处是什么,我不确定。我一直在使用它们中的一些。我开始使用ORM,认为它太棒了,但它意识到它的重量是多么重。
我开始研究mysqli并看到有一个fetch_object
。那嘿嘿嘿? Doctrine做得更好?我看到的唯一的好处是
persist()
一些实际很酷的特权是:
以上所有内容都很棒,但我不确定它们是否足以继续使用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;
}