Symfony Doctrine 从 OneToMany 关系中获取第一个排序项

Symfony Doctrine get first sorted item from OneToMany relation

所以我有两个实体:

导入:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Executions", mappedBy="import")
 * @ORM\OrderBy({"startedAt" = "DESC"})
 */
private $executions;

和处决:

/**
 * @ORM\Column(name="started_at", type="datetime", nullable=false, options={"default"="CURRENT_TIMESTAMP"})
 */
private $startedAt = 'CURRENT_TIMESTAMP';

一次导入可以执行多次。我需要的是导入实体中 lastExecution 的 属性。是否可以通过 startedAt 属性 的命令从执行实体中仅 select 一项?

executions 属性 也是按 startedAt 排序的,此时包含与一次导入相关的所有执行。我只想要一个具有最新开始日期的执行。

我试着这样定义新的 属性:

/**
 * @ORM\OneToOne(targetEntity="App\Entity\StockPriceImportExecutions", mappedBy="import")
 * @ORM\OrderBy({"startedAt" = "DESC"})
 */
private $lastExecution;

但 orderBy 似乎不是这样工作的。它总是 returns 一个且唯一的执行项目,不是最新的。

实现这个的最佳方法是什么?目标是有一个 属性 包含最近执行的对象。

您可以创建另一个 getter,它将 return 您的最后一条记录。 您使用的带排序的第一个选项

public function getLastRecord(): ?Execution
{
    return $this->executions->isEmpty() ? null : $this->executions->first();
}

第二个有条件,在那种情况下,你不需要@ORM\OrderBy({"startedAt" = "DESC"})

public function getLastRecord(): ?Execution
{
    $criteria = Criteria::create()
        ->orderBy(['startedAt' => 'DESC'])
        ->setMaxResults(1);

    $result = $this->executions->matching($criteria);

    return $result->isEmpty() ? null : $result->first();
}