您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

多层Relation 扩展(3.13)

2025/5/17 16:20:28发布17次查看
重载或重写 getrelation函数,以获得多层关联,关联参数:array('mapping_name'=>'next_mappingname_or_array', 'normal_mapping_name')
    /**
     * 获取返回数据的关联记录
     * @access protected
     * @param mixed $result  返回数据
     * @param string|array $name  关联名称
     * @param boolean $return 是否返回关联数据本身
     * @return array
     */
    protected function getrelation(&$result,$name='',$return=false) {
        if(!empty($this->_link)) {
            foreach($this->_link as $key=>$val) {
                $mappingname =  !empty($val['mapping_name'])?$val['mapping_name']:$key; // 映射名称
                if(empty($name) || true === $name || $mappingname == $name || (is_array($name) && (in_array($mappingname,$name) || array_key_exists($mappingname,$name) ))) {
                    $mappingtype = !empty($val['mapping_type'])?$val['mapping_type']:$val;  //  关联类型
                    $mappingclass  = !empty($val['class_name'])?$val['class_name']:$key;            //  关联类名
                    $mappingfields = !empty($val['mapping_fields'])?$val['mapping_fields']:'*';     // 映射字段
                    $mappingcondition = !empty($val['condition'])?$val['condition']:'1=1';          // 关联条件
                    $mappingkey =!empty($val['mapping_key'])? $val['mapping_key'] : $this->getpk(); // 关联键名
                    if(strtoupper($mappingclass)==strtoupper($this->name)) {
                        // 自引用关联 获取父键名
                        $mappingfk   =   !empty($val['parent_key'])? $val['parent_key'] : 'parent_id';
                    }else{
                        $mappingfk   =   !empty($val['foreign_key'])?$val['foreign_key']:strtolower($this->name).'_id';     //  关联外键
                    }
                    // 获取关联模型对象
                    $model = d($mappingclass);
                    switch($mappingtype) {
                        case has_one:
                            $pk   =  $result[$mappingkey];
                            $mappingcondition .=  and {$mappingfk}='{$pk}';
                            if (is_array($name) && array_key_exists($mappingname,$name)){
                                $relationdata   =  $model->relation($name[$mappingname])->where($mappingcondition)->field($mappingfields)->find();
                            }else{
                                $relationdata   =  $model->where($mappingcondition)->field($mappingfields)->find();
                            }
                            break;
                        case belongs_to:
                            if(strtoupper($mappingclass)==strtoupper($this->name)) {
                                // 自引用关联 获取父键名
                                $mappingfk   =   !empty($val['parent_key'])? $val['parent_key'] : 'parent_id';
                            }else{
                                $mappingfk   =   !empty($val['foreign_key'])?$val['foreign_key']:strtolower($model->getmodelname()).'_id';     //  关联外键
                            }
                            $fk   =  $result[$mappingfk];
                            $mappingcondition .=  and {$model->getpk()}='{$fk}';
                            if (is_array($name) && array_key_exists($mappingname,$name)){
                                $relationdata   =  $model->relation($name[$mappingname])->where($mappingcondition)->field($mappingfields)->find();
                            }else
                                $relationdata   =  $model->where($mappingcondition)->field($mappingfields)->find();
                            break;
                        case has_many:
                            $pk   =  $result[$mappingkey];
                            $mappingcondition .=  and {$mappingfk}='{$pk}';
                            $mappingorder =  !empty($val['mapping_order'])?$val['mapping_order']:'';
                            $mappinglimit =  !empty($val['mapping_limit'])?$val['mapping_limit']:'';
                            // 延时获取关联记录
                            if (is_array($name) && array_key_exists($mappingname,$name)){
                                $relationdata   =  $model->relation($name[$mappingname])->where($mappingcondition)->field($mappingfields)->order($mappingorder)->limit($mappinglimit)->select();
                            }else
                                $relationdata   =  $model->where($mappingcondition)->field($mappingfields)->order($mappingorder)->limit($mappinglimit)->select();
                            break;
                        case many_to_many:
                            $pk   =  $result[$mappingkey];
                            $mappingcondition =  {$mappingfk}='{$pk}';
                            $mappingorder =  $val['mapping_order'];
                            $mappinglimit =  $val['mapping_limit'];
                            $mappingrelationfk = $val['relation_foreign_key']?$val['relation_foreign_key']:$model->getmodelname().'_id';
                            $mappingrelationtable  =  $val['relation_table']?$val['relation_table']:$this->getrelationtablename($model);
                            $sql = select b.{$mappingfields} from {$mappingrelationtable} as a, .$model->gettablename(). as b where a.{$mappingrelationfk} = b.{$model->getpk()} and a.{$mappingcondition};
                            if(!empty($val['condition'])) {
                                $sql   .= ' and '.$val['condition'];
                            }
                            if(!empty($mappingorder)) {
                                $sql .= ' order by '.$mappingorder;
                            }
                            if(!empty($mappinglimit)) {
                                $sql .= ' limit '.$mappinglimit;
                            }
                            if (is_array($name) && array_key_exists($mappingname,$name)){
$mappingorder =  !empty($val['mapping_order'])?$val['mapping_order']:'';
                                $mappinglimit =  !empty($val['mapping_limit'])?$val['mapping_limit']:'';
                                $relationdata   =  $model->relation($name[$mappingname])
                                    ->field($model->gettablename().'.'.$mappingfields)
                                    ->join($mappingrelationtable. on  $mappingrelationtable.$mappingrelationfk = .$model->gettablename()...$model->getpk())
                                    ->where($mappingrelationtable..{$mappingfk}='{$pk}')
                                    ->order($mappingorder)
                                    ->limit($mappinglimit)
                                    ->select();
                            }else
                                $relationdata   =   $this->query($sql);
                            break;
                    }
                    if(!$return){
                        if(isset($val['as_fields']) && in_array($mappingtype,array(has_one,belongs_to)) ) {
                            // 支持直接把关联的字段值映射成数据对象中的某个字段
                            // 仅仅支持has_one belongs_to
                            $fields =   explode(',',$val['as_fields']);
                            foreach ($fields as $field){
                                if(strpos($field,':')) {
                                    list($relationname,$nick) = explode(':',$field);
                                    $result[$nick]  =  $relationdata[$relationname];
                                }else{
                                    $result[$field]  =  $relationdata[$field];
                                }
                            }
                        }else{
                            $result[$mappingname] = $relationdata;
                        }
                        unset($relationdata);
                    }else{
                        return $relationdata;
                    }
                }
            }
        }
        return $result;
    }
ad:真正免费,域名+虚机+企业邮箱=0元
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product