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();
}
所以我有两个实体:
导入:
/**
* @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();
}