Thinkphp5 联表(联合、关联、join)查询 alias、join、field、where、实操使用详解


Db::table('think_artist')

->alias('a')

->join('think_work w','a.id = w.artist_id')

->join('think_card c','a.card_id = c.id')

->select();


$join = [

    ['think_workw','a.id=w.artist_id'],

    ['think_cardc','a.card_id=c.id'],

];

Db::table('think_user')->alias('a')->join($join)->select();

 

 

 

Db::table('think_artist')

->alias('a')

->join('__WORK__ w','a.id = w.artist_id')

->join('__CARD__ c','a.card_id = c.id')

->select();

 

__WORK__和 __CARD__在最终解析的时候会转换为 think_work和 think_card

 

 

INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行


    public function ceshi()

    { 

        //给表取别名

        $alias=['admin_user'=>'au','admin_class'=>'ac'];

 

        //join数据必须包含2个中括号(SQL join 用于把来自两个或多个表的行结合起来。)第一个参数是表名,第二个参数是表达式

        $join= [['admin_class','au.admin_class_id=ac.id']];

 

        //如果多表结合需要这样写

        // $join= [

        //          ['admin_class','au.admin_class_id=ac.id'],

        //          ['admin_user_status aus','au.admin_user_status_id=aus.id']

        //         ];

 

        //需要展示的字段(列) ‘ac.class_name’取别名为‘classname’

        $field=['au.id','au.name','ac.class_name'=>'classname'];

 

        //条件数组 只有条件数组可以这样定义

        $where['au.admin_name']=['=','sushuailong'];

        $where['au.state']=['=','1'];

 

 

        $Admin_user = Admin_user::get(function($query) use($alias,$join,$field,$where){

            $query->alias($alias) 

                  ->join($join)

                  ->field($field)

                  ->where($where); 

        });

 

        echo $Admin_user;

   

    }



    public function index($key='')

    {

         //用模型获取分页数据,并转换成数组形式

      

 

 

             //给表取别名

             $alias=['client'=>'c','service_item'=>'si'];

 

             //join数据必须包含2个中括号(SQL join 用于把来自两个或多个表的行结合起来。)第一个参数是表名,第二个参数是表达式

              $join= [['service_item','c.id=si.client_id']]; 

 

            //需要展示的字段(列) 

            $field=['c.id','c.product_id','c.name','si.id'=>'si_id','si.name'=>'si_name','si.section'=>'si_section'];

 

            //条件数组 只有条件数组可以这样定义

            $where['c.id']=['>','0'];

 

             //关键词查询条件

            if($key!=''){

                //关键词放中间查询

                $map['c.name'] = ['like','%'.$key.'%'];  

                }

                else{

                $map['c.id'] = ['>',0];

                }

 

            //获取所有客户数据 

         $c_list=ClientModel::whereOr($map)->alias($alias)

                                                ->order(['si.id'=>'desc'])

                                                ->join($join)

                                                ->field($field) 

                                                ->paginate(10,false,['type'=>'Cppage']);

 

   

    

           

            //阻断程序执行

            //exit("$si_list");

    

            // 获取分页显示

            $page = $c_list->render();

            

            

    

            // 获取总数据数

            $c_num = $c_list->num_total();

     

 

        //获取产品所有数据

        $product_all = ProductModel::all(function($query){

            $query->order(['order'=>'asc','id'=>'asc']);

        });

 

 

    

            //模板赋值 

            $this->view->assign('c_list',$c_list);

            $this->view->assign('c_num',$c_num);

            $this->view->assign('product_all',$product_all);

            $this->assign('page', $page);

 

 

           //渲染

           return $this->view->fetch('serviceitem_list');

    }