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 只选择集合的最后一个条目的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 只查找那些在另一个集合中有条目的人

Doctrine 中的一对一关系仅更新一个字段 - 违反完整性约束:1062 重复条目

Doctrine ORM self ManyToOne 由于重复条目而无法插入

在 Doctrine2/Symfony2 中的重复条目上插入忽略

使用 insert() 方法通过 PHP Doctrine\DBAL 2 插入 DateTime 值

查询以选择每小时最新的员工条目