我有一个简单的问题。我看到了一个 Symfony2-Tutorial,博主到处使用没有关系的简单实体,并且还使用学说native-query来连接和查询不同的实体。
更好的是,使用学说本机查询或建立每次关系?
问候迈克尔
我有一个简单的问题。我看到了一个 Symfony2-Tutorial,博主到处使用没有关系的简单实体,并且还使用学说native-query来连接和查询不同的实体。
更好的是,使用学说本机查询或建立每次关系?
问候迈克尔
我认为这取决于结果集的处理方式。例如,假设以下关系:
一家公司有很多员工(1:N)
当这家公司在每个请求加载所有要显示的员工数据时执行选择查询时,只需弄清楚如果该公司拥有超过 10K 名员工会产生什么影响。在这种情况下,在模型中创建惰性关联可能是一个很好的做法:
<?php
/**
* @Entity
*/
class Company
{
/**
* @OneToMany(targetEntity="Employee", fetch="EXTRA_LAZY")
*/
public $employees;
}
在这种情况下,教义只会从数据库中触发所需的数据,因为它知道所有数据都会随着您的请求而逐渐被访问。您可以在教义的文档中阅读有关惰性关联的更多信息。
本机查询可以将任意 SQL 代码映射到对象,例如高度供应商优化的 SQL 或存储过程。快速的标量结果和更少的内存使用。请注意,复杂的模型关系可能过于繁重而无法操作服务器。例如,看看这个基于类表继承的结构:
有一个名为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),