找回密码
 立即注册

zongdongyang

新兵

  • 96

    积分

  • 4

    帖子

  • 0

    精华

本帖最后由 zongdongyang 于 2019-6-3 19:07 编辑

/**
* 关联查询,参数为数组,可以有多个,每个数组为一个关联的表
* 原方法中存在的问题:1、外键的值选择的是主表是主键的值,这一点是错误的,主键是自增的,相关联的表又如何提前定义出相应的数据,准确的值应该为主表中定义的外键的值。
*/
function r_select(){
                         $args=func_get_args();
                         if(count($args)==0 || !is_array($args[0])){
                                 return false;
                         }

                         $one=$this->select();
                         $pri=$this->fieldList["pri"];
                         $pris=array();

                        foreach($args as $tab) {

                                 list($tabName, $field, $fk)=$tab;

                                 if(!empty($field)){
                                        if(!in_array($fk, explode(",", $field))){
                                                Logcat::get_instance()->write("r_select(in_array):: True" );
                                                 $field=$field.",".$fk;
                                        }else{
                                                $field=$field;
                                                Logcat::get_instance()->write("r_select(in_array):: False" );
                                          }
                                 }else{
                                        $field='';
                                 }


                                  //以子数组的方式1:n
                                 if(!empty($tab[3])) {

                                         $sub=$tab[3];

                                         if(is_array($sub)) {

                                                 $obj=D($tabName);
                                                  $new=array();
                                                 foreach($one as $row){
                                                         //$where=array($fk=>$row[$pri]);
                                                         // $where="{$fk}={$row[$pri]}";
                                                         $where="{$fk}={$row[$fk]}";//外键值从主表的主键值修改为外键值

                                                         if(!empty($sub[3])){
                                                                 $where.=" AND {$sub[3]}";
                                                         }

                                                         if(!empty($sub[1])){
                                                                if(!empty($sub[2])){
                                                                        $row[$sub[0]]=$obj->field($field)->order($sub[1])->limit($sub[2])->where($where)->select();
                                                                }else{
                                                                        $row[$sub[0]]=$obj->field($field)->order($sub[1])->where($where)->select();
                                                                }
                                                         }else{
                                                                 if(!empty($sub[2])){
                                                                         $row[$sub[0]]=$obj->field($field)->limit($sub[2])->where($where)->select();
                                                                 }else{
                                                                         $row[$sub[0]]=$obj->field($field)->where($where)->select();
                                                                 }
                                                        }
                                                         $new[]=$row;
                                                 }

                                                 $one=$new;

                                         }else {
                                                 $new=array();
                                                 $npris=array();

                                                 foreach($one as $row){
                                                         $npris[]=$row[$sub];
                                                 }
                                                //以平级数组的方式1:1
                                                $where=array($fk=>$npris);

                                                 if(!empty($where[$fk])) {
                                                        $data=D($tabName)->field($field)->where($where)->select();
                                                        $i=0;
                                                        foreach($one as $row){

                                                                foreach($data as $read){

                                                                        if($read[$fk]==$row[$sub]){

                                                                                foreach($read as $k3=>$v3) {
                                                                                        if(array_key_exists($k3, $row)) {
                                                                                                $row[$tabName.'_'.$k3]=$v3;
                                                                                        }else{
                                                                                                $row[$k3]=$v3;
                                                                                        }
                                                                                }
                                                                                $new[$i]=$row;
                                                                                break;

                                                                        }
                                                                }

                                                                if(empty($new[$i])){
                                                                        $new[$i]=$one[$i];
                                                                }

                                                                $i++;
                                                        }
                                                        $one=$new;

                                                }
                                         }

                                 }else {
                                         foreach($one as $row){
                 //                                 $pris[]=$row[$pri];
                                                 $pris[]=$row[$fk];//外键值从主表的主键值修改为外键值
                                         }

                                         Logcat::get_instance()->write("r_select(没有第四个参数)::");

                                        $new=array();
                                        //以平级数组的方式1:1
                                        $where=array($fk=>$pris);
                                         if(!empty($where[$fk])) {
                                                $data=D($tabName)->field($field)->where($where)->select();

                                                foreach($data as $row){
                                                        foreach($one as $read){
                                                                // if($read[$pri]==$row[$fk]){  //对1:1,主键与外键的值肯定不一致,应改为外键判断                                                                                                                           if($read[$fk]==$row[$fk]){
                                                                        foreach($row as $k3=>$v3) {
                                                                                if(array_key_exists($k3, $read)) {
                                                                                        $read[$tabName.'_'.$k3]=$v3;
                                                                                }else{
                                                                                        $read[$k3]=$v3;
                                                                                }
                                                                        }

                                                                         $new[]=$read;
                                                                 }
                                                         }
                                                 }
                                                $one=$new;
                                        }
                                }

                         }
                         return $new;
                 }


0 个回复

您需要登录后才可以回帖 登录 | 立即注册
向日葵彩票开户 博亿彩票开户 小九彩票开户 天津福利彩票开户 9号彩票开户 云彩彩票开户 大乐购彩票开户 宝赢彩票开户 265彩票开户 优中彩票开户