【问题标题】:Doctrine only select last entry of collectionDoctrine 只选择集合的最后一个条目
【发布时间】: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 关系的新引用。

标签: php symfony doctrine


【解决方案1】:

我建议您在“StockEntryRepository”中创建一个方法。 此方法将检索您需要的最后一个项目,而无需遍历所有项目。

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2021-04-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2021-09-20
    • 2021-10-22
    相关资源
    最近更新 更多