admin 后台保存不了 tracking_number 的问题

bug问题 · successgo · 于 5年前 发布 · 1630 次阅读

症状:当 tracking_number 在数据库中原始值为 NULL 时,后台设置不了其他值。

原因是:yii 中的 ActiveRecord 方法,在设置属性时,通过 isset() 方法判断该 model 是否有此属性,isset() 返回 true 才会设置成功,否则不会设置,然而 tracking_number 在数据库里的默认值是 NULL。

isset() 文档地址参见 http://php.net/manual/en/function.isset.php

本文由 successgdc 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

共收到 8 条回复 fecshop 问题提问
Fecmall#15年前 0 个赞

改成:

public function save(){
        $editForm = Yii::$app->request->post('editForm');
        $order_id = $editForm['order_id'];
        $orderModel = Yii::$service->order->getByPrimaryKey($order_id);
        if(is_array($editForm) && $orderModel['order_id']){
            foreach($editForm as $k => $v){
                if (property_exists($orderModel, $k)) {
                    $orderModel[$k] = $v;
                }
            } 
            $orderModel->save();
        }
        echo  json_encode([
            'statusCode'=>'200',
            'message'=>'save success',
        ]);
        exit;
    }

bug fixed:

https://github.com/fecshop/yii2_fecshop/commit/894b95d067fcdc8c9cba0a71471de67157a00be5

successgo#25年前 0 个赞

使用 property_exists 并不可以,须用

if ($orderModel->hasAttribute($k)) {
	$ordderModel[$k] = $v;
}
Fecmall#35年前 0 个赞

@successgdc #2楼

你说的不可以,指的是不能保存tracking_number,还是其他什么意思?

我本地是可以判断成功并保存de

successgo#45年前 0 个赞

不可以 表示保存不成功。

Fecmall#55年前 1 个赞

你这种方法,在yii2里面用,整体性更好,采纳你的写法。

successgo#65年前 0 个赞

目标是先能用,不管好不好,可惜,在我这边儿的确不奏效,不知何解。

嗯,我也是看了 yii 的源码,看到有此方法。

那么,你自己先 fix 吧,下回类似的我来提 pr。大佬你这么忙的,哈哈。

successgo#85年前 0 个赞

果然很快速。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics