Php 获取细枝中的最小值

Php 获取细枝中的最小值,php,symfony,twig,Php,Symfony,Twig,在我的产品和链接之间,我有一个关系网。在链接中,我有一个名为price的列,我正在将产品列表传递给我的小枝,我想从price中获取最低值。我该怎么做 这就是我现在列出我的产品的方式: {% for product in products %} Name: {{ product.name }} Price: {% for prodLink in product.getProduktLinks|slice(0, 1) %} <span class="price">{{

在我的产品和链接之间,我有一个关系网。在链接中,我有一个名为
price
的列,我正在将产品列表传递给我的小枝,我想从
price
中获取最低值。我该怎么做

这就是我现在列出我的产品的方式:

{% for product in products %}
Name: {{ product.name }}
Price: {% for prodLink in product.getProduktLinks|slice(0, 1) %}
          <span class="price">{{ prodLink.price }}</span>
       {% endfor %}
{%用于产品中的产品%}
名称:{{product.Name}
价格:{product.GetProduktLink中prodLink的百分比|切片(0,1)%}
{{prodLink.price}}
{%endfor%}

切片
允许我只显示一个价格,但它不是最低值。我可以使用什么使其工作?

本质上,这是一个典型的reduce操作

有几种不同的方法可以做到这一点(但是,请注意n+1查询问题):

您也可以在twig中执行类似操作(注意:仅在twig>=1.41或twig>=2.10中):

但是,最好是调整产品存储库,以设置虚拟财产的最低价格,例如,这样您就不会单独加载所有产品的所有链接

老实说,我不太确定这是否有效

// in ProductRepository
public function getWithMinPrices() {
    $qb = $this->createQueryBuilder('product');
    $qb
       ->addSelect('(SELECT MIN(pl.price) FROM product.productLinks pl) as minprice')
       // do other query stuff like limiting number of products, searching etc.

    $result = $qb->getQuery()->getResult();
    // in contrast to normal queries, you now have an array of arrays with
    // one object and the minprice
    return array_map(function($row) {
        $product = $row[0];
        $product->minPrice = $row['minprice'];
        return $product;
    }
}
之后,您可以通过
product.minPrice

您还可以结合以下方法:

protected $minPrice = null;
// in the product entity class
public function getMinPrice() {
    if(!is_null($this->minPrice)) {
        $this->minPrice = array_reduce($this->getProductLinks(), function($lowest, $link) {
            return min($lowest ?? $link->getPrice(), $link->getPrice());
        });
    }
    return $this->minPrice;
}
public function setMinPrice($minPrice) {
    $this->minPrice = $minPrice;
}
然后应该在存储库函数中调用
$product->setMinPrice($row['minprice'])

这种混合方法将确保,即使没有调用存储库函数,您也总能获得最低的价格


作为旁注:reduce调用始终可以由循环替换:

$min = null;
foreach($this->getProductLinks() as $link) {
   $min = min($min ?? $link->getPrice(), $link->getPrice());
}

看起来没那么吓人,语义上也差不多。。。twig中也可能有类似的功能,但这非常丑陋,但可能仍然足够好

您可以在产品模型中添加一个新的
getLowestPrice()
方法,因为它需要自定义逻辑,这在twig上下文中很难实现。使用Twig仅用于纯表示(尽可能)。创建链接也可以,但正如@yceruto所指出的,此功能可能属于product类。@yceruto知道此方法的外观吗?我使用了第一个方法,但当我有两个以上的链接时,它只比较了前两个。有什么方法可以让它工作吗?我已经测试过几次了,reduce调用应该可以工作,对于twig和php都可以。如果它对您不起作用,我怀疑您的
getPrice()
调用会返回一些不容易比较的东西(如对象),或者您的
getProductLinks()
调用只返回价格的一个子集。第一个方法是小提琴,显然这些类非常简化。。。为了完整起见,用小树枝拉小提琴:
protected $minPrice = null;
// in the product entity class
public function getMinPrice() {
    if(!is_null($this->minPrice)) {
        $this->minPrice = array_reduce($this->getProductLinks(), function($lowest, $link) {
            return min($lowest ?? $link->getPrice(), $link->getPrice());
        });
    }
    return $this->minPrice;
}
public function setMinPrice($minPrice) {
    $this->minPrice = $minPrice;
}
$min = null;
foreach($this->getProductLinks() as $link) {
   $min = min($min ?? $link->getPrice(), $link->getPrice());
}