想查价格在区间内并且状态为在售的商品,结果把已下架的也查出来了,条数比预期多出将近一倍。乍看像缓存或者权限的锅,追下去往往不是。

$q->set('meta_query', [
  'relation' => 'AND',
  ['key' => 'status', 'value' => 'onsale'],
  ['key' => 'price', 'value' => 100, 'type' => 'NUMERIC'],
]);

追下去是这么回事:多个条件平铺在同一个数组里时 relation 只作用于同级,想表达先或后与的关系必须再嵌套一层数组,否则条件被拉平。

「meta_query 逻辑关系」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,把同一组的条件放进带 relation 的子数组里;外层再用 AND 关系把刚才那两组条件串起来;打印生成的 SQL 语句确认括号加在了哪里。

验收就看一点,结果只剩在售的商品,条数与后台筛选出来的一致。

作者 9823189