Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否基于实体属性值查询所有对象?_Php_Sql_Symfony_Doctrine Orm_Dql - Fatal编程技术网

Php 是否基于实体属性值查询所有对象?

Php 是否基于实体属性值查询所有对象?,php,sql,symfony,doctrine-orm,dql,Php,Sql,Symfony,Doctrine Orm,Dql,我的实体中有一个自定义属性: public function getStockSoldPercentage() { return ($this->getStockSold() / $this->getFullStock()) * 100; } 通过使用此属性,我可以访问已售出的库存百分比。目前我使用这样的查询 $bestellers = $this->getDoctrine()->getRepository('CoreBundle:Products')->

我的实体中有一个自定义属性:

public function getStockSoldPercentage()
{
    return ($this->getStockSold() / $this->getFullStock()) * 100;
}
通过使用此属性,我可以访问已售出的库存百分比。目前我使用这样的查询

$bestellers = $this->getDoctrine()->getRepository('CoreBundle:Products')->findAll();
并直接在my twig模板中处理对象(百分比高于75%的所有产品)的过滤。所以你看,这在缩放方面不是很好。当我不得不在用户每次访问网站时查询1000个产品时,这是过分了

我想构建一个自定义实体存储库,类似于
findAllBestSellers()
,只需查询
getStockSoldPercentage()
属性高于75的所有对象

我该怎么做

编辑:
getStockSeld()
getFullStock()
不是字段,而是函数。它们看起来像这样:

public function getFullStock()
{
    $stock = 0;
    foreach ($this->variants as $variant) {
        $stock += $variant->getStock();
    }
    return $stock;
}

public function getStockSold()
{
    return $this->getFullStock() - $this->getCurrentStock();
}

事实上,应用程序逻辑太复杂,无法在应用程序内部以其他方式完成。您不能简单地用SQL请求数据库以获得所需的内容

但是,我建议您创建一个sql函数,该函数返回您的产品并转录其中的所有逻辑。这将在应用服务器上实现负载平衡,mysql的效率要高得多

之后,您可以通过执行以下操作调用函数:

public function findAllBestSellers() {

    $sql = "SELECT PRODUCTS_WITH_STOCK_SOLD_PERCENTAGE() AS products";
    $stmt = $this->dbal->executeQuery($sql);

    $stmt->execute();

    return current($stmt->fetch());
}

解决问题的不同方法:

//In your controller

$bestsellers = $this->getDoctrine()->getRepository('CoreBundle:Products')->findAll();

$results = [];

foreach ($bestsellers as $bestseller) {
    if ($bestseller->getStockSoldPercentage() >= '75') {
        $results[] = $bestseller;
    }
} 

return $this->render('YourTemplate.html.twig', ["results" = > $results]);

这实际上是许多应用程序将有两个数据库的典型示例。一个用于实时更新,另一个用于报告

考虑在每次出售股票时计算新股票的售出百分比,然后将价值存储到某个地方。这显然会减慢您的个人股票交易,但会大大加快您的报告查询速度。决定这是否是一个可接受的权衡取决于你


最终,你可以转向一个更加基于事件的系统,在这个系统中,卖出股票会触发一条信息。一个完全独立的进程将侦听这些消息并相应地更新您的报告表。这两个方面都能发挥最大的作用。

谢谢你的建议,但对我来说不起作用。请看我的编辑!我能看看你们的产品实体吗?或者仅仅是:
variant
是否是另一个与
产品
有很多关系的实体。试试看,但我对这个要求有很大的怀疑。我认为您必须对variant执行子请求才能完成良好的任务。正如我在新答案中所解释的那样:在应用程序中,你无法做得更好。您必须通过symfony外部方式,我也这么想,但是查询所有besteller对象并基于过滤器生成新数组在内存方面不是也太过分了吗?这样我就必须查询2000个对象,只需将10个对象添加到一个特殊数组中……你怎么看?我同意,这不是“最干净”的选项。但是,2K行不应该对性能产生实际影响。无论如何,最好的方法是Julien所描述的。这不是关于报道。我们需要这个百分比值在生产网站上实时计算一些东西…这是相同的概念。在本例中,报告是一个html文档,而不是一张纸。或许可以看看CSQ模式: