Symfony5.3下Twig展示Certificate关联最新Purchase的起止datetime方法
实现方案
方案一:实体新增便捷方法(推荐,适配你的使用习惯)
直接在Certificate实体类中新增获取最新关联Purchase的方法,和你之前用__toString()获取关联属性的逻辑类似,只是可以返回完整的Purchase对象供你取两个时间字段:
// 加入Certificate类内部 public function getLatestPurchase(): ?Purchase { // 按id倒序取最新一条,你也可以根据业务需求改为按start/end时间倒序 $criteria = \Doctrine\Common\Collections\Criteria::create() ->orderBy(['id' => 'DESC']) ->setMaxResults(1); $matched = $this->purchase->matching($criteria); return $matched->isEmpty() ? null : $matched->first(); }
Twig模板中直接调用该方法即可:
{# 表格遍历Certificate的循环内 #} <tr> {# 其他Certificate字段展示 #} <td> {% if certificate.latestPurchase is not null %} {{ certificate.latestPurchase.start|date('Y-m-d H:i') }} {% else %} 暂无购买记录 {% endif %} </td> <td> {% if certificate.latestPurchase is not null %} {{ certificate.latestPurchase.end|date('Y-m-d H:i') }} {% else %} 暂无购买记录 {% endif %} </td> </tr>
如果要优化该方法的查询性能,可以给Certificate的purchase关联注解加上fetch="EXTRA_LAZY"参数,避免查询时加载所有关联的Purchase:
/** * @ORM\OneToMany(targetEntity=Purchase::class, mappedBy="certificate", fetch="EXTRA_LAZY") */ private $purchase;
方案二:Repository预加载(适合大数据量列表场景)
如果你的Certificate列表数据量较大,方案一会产生N+1查询问题,你可以在查询Certificate列表时直接关联预加载最新的Purchase记录,在CertificateRepository中新增查询方法:
public function findAllWithLatestPurchase(): array { return $this->createQueryBuilder('c') ->leftJoin('c.purchase', 'p') ->addSelect('p') ->orderBy('p.id', 'DESC') // 按需要调整排序规则 ->getQuery() ->getResult(); }
控制器中调用该方法获取列表再传给Twig即可,后续Twig用法和方案一完全一致。
内容的提问来源于stack exchange,提问作者Daniel Gavriliuc
相关产品推荐
相关产品推荐

