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());
}