【发布时间】:2021-12-23 21:51:45
【问题描述】:
我有以下实体:
class Product
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\StockEntry", mappedBy="product")
*
* @Groups({"product:read", "product:read:all"})
*/
private Collection $stockEntries;
public function getStockEntries(): Collection
{
return $this->stockEntries;
}
public function getLastBuyPrice(): float
{
/** @var StockEntry $lastEntry */
$lastEntry = $this->getStockEntries()->last();
if ($lastEntry) {
return $lastEntry->getBuyPrice() ?: 0.;
}
return 0.;
}
}
我的问题是当我调用我的getLastBuyPrice() 方法时,所有StockEntries 都会被检索到,这可能很长(一个产品可以有数百个库存条目)。我正在寻找一种方法来重写getLastBuyPrice(),以便只检索最新的StockEntry 来计算lastBuyPrice。
【问题讨论】:
-
您在实体内部使用逻辑,这是一种不好的做法来检索我建议使用查询来实现的最后一个元素。使用查询将使获取速度更快,而不是检索完整集合并获取最后一个元素。
-
缺少使用 DQL 或自定义查询。如果您绝对需要 Product 实体的最新条目,请在 StockEntry 表上使用 after delete update 和 insert 触发器或事件调度程序(如果仅依赖于 ORM),以通过单独表或产品中引用的 id 维护最新条目状态桌子。然后,您可以将
$latestStockEntry关联添加到您的 Product 实体,以作为OneToOne关系的新引用。