zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    OC
    提取AppDelegate.m中的"RDVTabBarController"第三方框架的方法
    spring_aop
    spring_xml配置&依赖注入
    关于idea运行web项目时出现的浏览器问题
    Java中main方法参数类型个人粗略理解
    函数式编程_lambda
    反射_注解
    pl/sql使用小技巧
    触发器&索引&视图
  • 原文地址:https://www.cnblogs.com/widgetbox/p/12494450.html
Copyright © 2011-2022 走看看