Doctrine 只选择集合的最后一个条目
Posted
技术标签:
【中文标题】Doctrine 只选择集合的最后一个条目【英文标题】:Doctrine only select last entry of collection 【发布时间】: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
关系的新引用。
【参考方案1】:
我建议您在“StockEntryRepository”中创建一个方法。 此方法将检索您需要的最后一个项目,而无需遍历所有项目。
【讨论】:
以上是关于Doctrine 只选择集合的最后一个条目的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine 中的一对一关系仅更新一个字段 - 违反完整性约束:1062 重复条目
Doctrine ORM self ManyToOne 由于重复条目而无法插入
在 Doctrine2/Symfony2 中的重复条目上插入忽略