李东涛 2018-02-12 13:06:27 506次浏览 0条回复 1 1 0

在Order数据模型中,定义了与user表的关系

......
public function getUser(){
 
   return $this->hasOne(User::className(),['userid'=>'userid']);

查询查询订单表与user表的username字段的时候使用了下面的语句

 $Order=  Order::find()
            ->joinWith('user')
            ->select(['Order.name','user.username'])
           ->asArray()
             ->all();
  var_dump(  $Order);          

输出结果是把整个user表的信息都打印了出来。真是坑爹啊,这些信息足以泄露整个重要的user表的登录信息 反复查看 vendor\yiisoft\yii2\db\ActiveQuery.php文件的joinWith方法定义,发现一句 @param boolean|array $eagerLoading whether to eager load the relations specified in $with.

 * When this is a boolean, it applies to all relations specified in `$with`. Use an array
 * to explicitly list which relations in `$with` need to be eagerly loaded. Defaults to `true`.

原来 joinWith('user')默认的是user表的全部字段,如果 $eagerLoading输入一个数组,就只显示数组中的字段 于是语句改为:

  $Order=  Order::find()
            ->joinWith('user',['username'])
            ->select(['Order.name','user.username'])
           ->asArray()
             ->all();
  var_dump(  $Order);   

查看结果,输出就只有两个字段了,特写出来,希望对遇上同类问题的朋友有所帮助

觉得很赞
    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册