• tp6通过闭包方式连表查询的问题


    业务背景:

    最近在做龙巅广告系统,使用了新的tp6框架

    相关数据结构:

    advert_plan 广告计划表

    advert_plan_position 广告计划位置表

    这两个表示 计划表和位置表是 1:n

    需求:

    在计划列表中的信息已经是包含跨表信息,其中就有位置表里的信息,那该怎么做呢?

    /**
     * 广告计划表
     * Class AdvertPlan
     * @package appcommonmodel
     * @author:hann
     * @time:2020-03-10
     */
    namespace appcommonmodel;
    
    class AdvertPlan extends Common {
        
        protected $pk = 'plan_id';
    
        /**
         * 位置关联模型 1对n
         * User: feng
         * Date: 2020-03-14
         * @return 	hinkmodel
    elationHasMany
         */
        public function planPosition() {
            return $this->hasMany(AdvertPlanPosition::class, 'plan_id', 'plan_id');
        }
    }
    

      

    写了 在Plan表的model里写关联模型planPosition方法

    然后执行查询如下

            //连表查询
            $data = $model_plan->with(['planPosition'])
                ->field('*')
                ->where($where)
                ->order('plan_id')
                ->paginate();
            echo $model_plan->getLastSql();
            dd($data->toArray());

    这样连表查询是没问题的。

    但问题来了,根据需求,【要根据位置来筛选计划】,那就得设置位置表的where条件呗,代码如下:

        //连表查询,异常
            //haswhere 关联表查询失败!
            $data = $model_plan->with(['planPosition'])
                ->field('*')
                ->where($where)
                ->hasWhere('planPosition',['position'=>1])
                ->order('plan_id')
                ->paginate();
            echo $model_plan->getLastSql();
            dd($data->toArray());
    

     问题来了,提示报错:

    #0 [10501]PDOException in PDOConnection.php line 722
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'AdvertPlan.plan_id' in 'on clause'
    

     

    错误原因:

    with不能与hasWhere连用,必须使用with闭包的形式才能实现子模型的条件筛选,具体如下:

           //连表查询
            $data = $model_plan->with(
                [
                    'planPosition'	=> function($query) {
                        if(!empty($where_position)){
                            $query->where($where_position);
                        }
                    },
                ])
                ->field('*')
                ->where($where)
                ->order('plan_id')
                ->paginate();
            echo $model_plan->getLastSql();
            dd($data->toArray());
    

      

    author:hann

    手册链接:https://www.kancloud.cn/manual/thinkphp6_0/1037600

  • 相关阅读:
    hdu 1576 A/B(exgcd、乘法逆元+整数快速幂)
    CSS3带小图标垂直下拉菜单
    CSS3动画表单
    灰色3D按钮组合
    半透明菜单导航
    CSS3透明背景表单
    CSS3手风琴菜单 可同时折叠多个菜单
    jQuery图片下滑切换焦点图
    jQuery消息提示框插件Tipso
    jQuery自动轮播图片焦点图
  • 原文地址:https://www.cnblogs.com/widgetbox/p/12494450.html
Copyright © 2020-2023  润新知