Twig多字段数组排序:按updated_at与created_at取最新值排序失效如何解决
问题原因
- 运算符优先级错误:Twig 中太空船运算符
<=>的优先级高于空合并运算符??,原始代码实际执行顺序和预期完全不符,等价于a.updated_at ?? (a.created_at <=> b.updated_at) ?? b.created_at,逻辑完全错误,因此排序不符合预期。 - 缺少括号约束运算顺序:没有用括号把单条数据的日期取值逻辑包裹,导致优先级混乱。
- 可选方向问题:如果预期是最新内容排在前面,默认的升序排序方向也需要调整。
修复方案
将单条数据的日期取值逻辑用括号包裹,确保先拿到每条数据的最新日期(优先取updated_at,不存在则回退到created_at)后再做比较。
升序排序(旧内容在前,新内容在后)
{% set list = myArray|sort((a, b) => (a.updated_at ?? a.created_at) <=> (b.updated_at ?? b.created_at)) %}
降序排序(新内容在前,旧内容在后,多数场景的预期效果)
将两个比较项的位置互换即可:
{% set list = myArray|sort((a, b) => (b.updated_at ?? b.created_at) <=> (a.updated_at ?? a.created_at)) %}
额外注意事项
如果你的created_at、updated_at是字符串格式的日期,需要先转成时间戳再比较,避免字符串比较出现异常,示例:
{% set list = myArray|sort((a, b) => (date(b.updated_at ?? b.created_at).timestamp) <=> (date(a.updated_at ?? a.created_at).timestamp)) %}
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

