ThinkPHP5-模型关联|隐藏模型字段优化

84 篇文章 0 订阅
73 篇文章 0 订阅

模型关联(主从表 banner banner_item)
    界面上有多个banner位 每个banner位置具体显示图片个数 banner_item
    查询banner 获取当前banner位信息以及具体banner_item信息

    banner->banner_item   1->many
    定义关联
        class Banner extends Model
        {
            public function items() {
                //当前banner有多个banner_item 通过banner_item外键banner_id与banner的主键id 相关联
                return $this->hasMany('BannerItem','banner_id','id') ;
            }
        }
    查询关联
        //链式方法with('已经定义的关联方法名') 表示当前模型查询时需要关联 一个已定义的关联
         $banner = BannerModel::with('items')->find($id) ;
         ------------------
         sql日志打印信息
            [运行时间:0.075166s] [吞吐率:13.30req/s] [内存消耗:4,111.25kb] [文件加载:48]
            [ sql ] [ DB ] CONNECT:[ UseTime:0.000743s ] mysql:host=127.0.0.1;port=3306;dbname=zerg;charset=utf8
            [ sql ] [ SQL ] SHOW COLUMNS FROM `banner` [ RunTime:0.005334s ]
            [ sql ] [ SQL ] SELECT * FROM `banner` WHERE  `id` = 1 LIMIT 1 [ RunTime:0.001314s ]
            [ sql ] [ SQL ] SHOW COLUMNS FROM `banner_item` [ RunTime:0.001654s ]
            [ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE  `banner_id` = 1 [ RunTime:0.000748s ]

    嵌套关联
        1>主表有多张从表
            定义关联 banner表与banner_item X 都有关联

                class Banner extends Model
                    {
                        public function items() {
                            //当前banner有多个banner_item 通过banner_item外键banner_id与banner的主键id 相关联
                            return $this->hasMany('BannerItem','banner_id','id') ;
                        }
                        public function items1() {
                            //对应关系 视情况而定
                            return $this->hasMany('X','外键','主键') ;
                        }
                    }
            查询关联
                //with()接收数组
                $banner = BannerModel::with(['items','items1'])->find($id) ;
        2>banner与banner_item 1->many  banner_item与img belongsTo
            定义关联
                class Banner extends Model
                {
                    public function items() {
                        return $this->hasMany('BannerItem','banner_id','id') ;
                    }
                }

                class BannerItem extends Model
                {
                    public function img() {
                        return $this->belongsTo('Image','img_id','id') ;
                    }
                }
            查询关联
                 $banner = BannerModel::with(['items','items.img'])->find($id) ;
            ---------------
            log
                [运行时间:0.060316s] [吞吐率:16.58req/s] [内存消耗:4,288.93kb] [文件加载:51]
                [ sql ] [ DB ] CONNECT:[ UseTime:0.000421s ] mysql:host=127.0.0.1;port=3306;dbname=zerg;charset=utf8
                [ sql ] [ SQL ] SHOW COLUMNS FROM `banner` [ RunTime:0.000815s ]
                [ sql ] [ SQL ] SELECT * FROM `banner` WHERE  `id` = 1 LIMIT 1 [ RunTime:0.000395s ]
                [ sql ] [ SQL ] SHOW COLUMNS FROM `banner_item` [ RunTime:0.000885s ]
                [ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE  `banner_id` = 1 [ RunTime:0.000360s ]
                [ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE  `banner_id` = 1 [ RunTime:0.000465s ]
                [ sql ] [ SQL ] SHOW COLUMNS FROM `image` [ RunTime:0.004347s ]
                [ sql ] [ SQL ] SELECT * FROM `image` WHERE  `id` IN (65,2,3,1) [ RunTime:0.002276s ]
        优化:
            在controller层
                $banner = BannerModel::with(['items','items.img'])->find($id) ;
                可读性没有BannerModel::getBannerByID()好  暴露了查询细节

            此处在 model封装一层方法 在controller层调用
                class Banner extends Model
                {
                    public function items() {
                        return $this->hasMany('BannerItem','banner_id','id') ;
                    }
                    public static function getBannerByID($id)
                    {
                        $banner =   self::with(['items','items.img'])->find($id) ;
                        return $banner ;
                    }
                }

                class Banner
                {
                    /**
                     * 接口说明 获取指定id的banner信息
                     * @url /banner/:id
                     * @http GET
                     * @id banner的id号
                     */
                    public function getBanner($id)
                    {
                        (new IDMustBePostiveInt())->goCheck()  ;

                        $banner = BannerModel::getBannerByID($id) ;
                        if(!$banner) {
                            throw new BannerMissException() ;
                        }
                        return $banner ;
                    }

            隐藏模型字段
                (安全性 有些字段不宜返回客户端)
                (返回的json结构简洁)
            $banner = BannerModel::getBannerByID($id) ;返回了模型所有字段
            但是如id delete_id 等一些无意义字段不需要返回
            1>将 $banner对象转换成数组
                $data = $banner->toArray() ;
                unset($data['delete_time']) ;
                unset($data['update_time']) ;
            2>使用对象方法
                hidden()需要隐藏的字段
                $banner->hidden(['delete_time','update_time','items.delete_time','items.update_time','items.img.delete_time','items.img.update_time'] ) ;

                visible()需要显示的字段
                $banner->visible(['id','name','description','items.img_id','items.key_word','items.img.url']) ;
            3>在模型内部隐藏字段
                Model类自带属性  protected $hidden=[] ; protected visible=[] ;
                class Banner extends Model
                {
                    //设置隐藏字段
                    protected $hidden = ['delete_time','update_time'] ;
                    //设置显示字段
                    protected $visible = [] ;

                    public function items() {
                        return $this->hasMany('BannerItem','banner_id','id') ;
                    }
                    public static function getBannerByID($id)
                    {
                        $banner =   self::with(['items','items.img'])->find($id) ;
                        return $banner ;
                    }
                }

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值