Magento下单后关联客户:customerId被重置为NULL的排查方法
遇到这种刚设置完字段就被重置的情况,大概率是后续某个流程改写了订单数据,我给你分享几个实用的排查步骤:
开启数据库查询日志追踪更新语句
在app/etc/env.php的数据库配置里添加log_query参数,开启后会记录所有对数据库的操作:'db' => [ 'table_prefix' => '', 'connection' => [ 'default' => [ 'host' => 'localhost', 'dbname' => 'your_db', 'username' => 'user', 'password' => 'pass', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8;', 'active' => '1', 'log_query' => true // 开启查询日志 ] ] ]重现问题后,查看
var/log/debug.log里的SQL语句,找到最后一条更新sales_order.customer_id为NULL的语句,对应的调用栈会告诉你是哪个脚本发起的这个操作。用Xdebug打条件断点抓调用栈
直接在订单模型的setCustomerId方法里加条件断点,当传入的参数是NULL时触发中断;或者在\Magento\Framework\Model\AbstractModel::_beforeSave方法里,判断当前模型是订单且customer_id被设为NULL时暂停。这样就能顺着调用栈找到到底是哪个模块的代码在做这个操作。排查同事件的其他观察者
你监听的sales_order_place_after事件可能有多个观察者执行,你的模块之后的观察者可能改写了数据。用命令列出所有监听该事件的观察者:bin/magento event:list sales_order_place_after逐个检查这些观察者的代码,看有没有重置
customer_id的逻辑,尤其是那些在你的模块之后执行的(可以看配置里的sort_order值)。检查支付相关的后续流程
很多时候支付模块会在订单创建后修改订单数据,比如支付回调、状态更新时。去检查你当前使用的支付方法对应的模型,比如capture、authorize方法,或者监听sales_order_payment_place_end、sales_order_save_after这类事件的观察者,看有没有涉及修改customer_id的逻辑。排查数据库触发器
也有可能是数据库层面的触发器在搞鬼,执行SQL查询检查sales_order表的触发器:SHOW TRIGGERS LIKE 'sales_order%';如果存在自定义触发器,看看是不是它在更新时把
customer_id重置为NULL了。开启详细日志排查
在app/etc/env.php里把日志级别设为debug:'log' => [ 'debug' => [ 'enabled' => true, 'file_name' => 'debug.log', 'log_level' => \Monolog\Logger::DEBUG, ], 'system' => [ 'enabled' => true, 'file_name' => 'system.log', 'log_level' => \Monolog\Logger::DEBUG, ], ]重现问题后,查看
var/log/system.log和var/log/debug.log里的订单保存相关日志,里面会记录每个操作的调用栈,帮你定位到问题脚本。
内容的提问来源于stack exchange,提问作者Joost Meijer

