webman模型层赋值的问题

jinggge

bug描述

控制器给model变量赋值,model里读取不到值
用的think-orm

程序代码或配置

控制器代码
$goods = new GoodsModel();
$goods->_user = 1231;

model里代码
 public $_user = 321;
     public function getPriceAttr($value)
    {
        $value = $value *$this->_user;

        return $value;

    }

期待的结果及实际结果

如何将$_user赋值给model里 并读取到

系统环境及workerman/webman版本

webman1.4.7

937 2 0
2个回答

nitron
$goods = new GoodsModel();
$goods->_user = 1231;
$v = $goods->getPriceAttr(2);

然后输出什么?

  • jinggge 2022-10-20

    我需要在model里读取到这个值,读到的为null

nitron

给详细代码吧

  • jinggge 2022-10-20

    控制器里是这样赋值的
    $goods = new GoodsModel();

    $goods->_user = 1231;//赋值用户数据

    $detail = $goods->getGoodsDetail($goods_id);

    model里

    namespace app\api\v1\model;
    use think\Model;

    class Goods extends Model
    {
    protected $name = 'skus';//定义表名
    public $_user;//定义用户数据

    public function getPriceAttr($value)
    {
    
        $value = $this->_user;  //取值
    
        return $value;
    
    }

    }

  • nitron 2022-10-20
    $goods = new GoodsModel();
    
    $goods->_user = 1231;//赋值用户数据
    
    $detail = $goods->getGoodsDetail($goods_id);
    $detail->price; // 值是什么
    
    $detail->_user = 1231;
    $detail->price; // 值是什么
  • jinggge 2022-10-20

    商品价格,浮点型的

  • nitron 2022-10-20

    你能否照我上面的代码跑一下,看看输出的值?
    你能否贴贴你这个getGoodsDetail的具体代码?

  • jinggge 2022-10-20

    好像是在模型里里定义变量,就没办法夸方法读取

  • jinggge 2022-10-20

    是用think-orm的获取读取$_user然后对价格重新计算

  • nitron 2022-10-20

    大哥您这个问题我解决不了,您另请高明吧

  • jinggge 2022-10-20

    控制器代码
    public function getGoodsDetail(Request $request)
    {

    $source = $request->post('source',9);
    
    $goods_id = $request->post('goods_id');
    
    switch ($source) {
    
        case 1:
    
            break;
        default:
    
            $goods = new GoodsModel();
    
            $goods->_user = 1231;
    
            $detail = $goods->getGoodsDetail($goods_id);
    
            break;
    }
    
    return json(['code'=>0,'data'=>$detail,'msg'=>'获取成功']);

    }
    模型代码
    <?php
    namespace app\api\v1\model;
    use Exception;
    use think\Model;

    class Goods extends Model
    {

     protected $name = 'skus';
    
     public $_user;

    public function getGoodsDetail($goods_id)
    {

      try {
    
          $detail =$this->where(['sku'=>$goods_id])->withoutField('state,status_id,created_at,,created_at')->find();
    
          return $detail;
    
      } catch (Exception $e) {
    
           return json(['code'=>-1,'data'=>null,'msg'=>'服务异常,请联系管理员处理!']);
    
      }

    }

    public function getPriceAttr($value)
    {

        $value =$value * $this->user;
        return $value;
    
     }

    }

  • Gin 2022-10-20

    user 放到初始化看看行不

  • Gin 2022-10-20

    getGoodsDetail($goods_id) 打印这个看看是不是模型实例的(原始)数据,如果不是 获取器是不生效的. 用动态获取器
    User::withAttr('name', function($value, $data) {
    return strtolower($value);
    })->select();
    这样的试试 . 还不行就手动吧

  • nitron 2022-10-20

    你在getGoodsDetail()里返回的是一个新的model,不是你上面的new GoodsModel(), $_user没赋值当然是null;

    $goods = new GoodsModel();
    $goods->_user = 1231;  // 这里赋值针对的是$goods
    
    $detail = $goods->getGoodsDetail($goods_id);  // 这里是新的model.即$detail
    $detail->_user = 1231; // 这样才算给model(即$detail)赋值
    $detail->price; 

    你可以尝试把getGoodsDetail改成,不用ThinkORM,没做测试验证

    public function getGoodsDetail($goods_id)
     try {
    
          $detail =$this->where(['sku'=>$goods_id])->withoutField('state,status_id,created_at,,created_at')->find();
          $detail->_user = $this->_user;
    
          return $detail;
    
      } catch (Exception $e) {
    
           return json(['code'=>-1,'data'=>null,'msg'=>'服务异常,请联系管理员处理!']);
    
      }
    }
    // 控制器
    $goods = new GoodsModel();
    $goods->_user = 1231;
    $detail = $goods->getGoodsDetail($goods_id);
    echo $detail->price;

    下次问问题尽量贴全代码,不要弄得语焉不详,沟通起来累得不行,本来几分钟的事情,浪费大家那么多时间

年代过于久远,无法发表回答
🔝