欢迎光临
我们一直在努力

dbeav 多表关联详解

:目前对表关联在ECOS中有两种方法对多表进行关联

1.直接在dbschema中进行定义

'type_id' =>
		array (
		  'type' => 'table:goods_type', //关联goods_type表
		  'sdfpath' => 'type/type_id', //关联goods_type表中的type_id字段
		  'label' => app::get('b2c')->_('类型'),
		  'width' => 75,
		  'editable' => false,
		  'filtertype' => 'yes',
		  'in_list' => true,
		  'default_in_list' => true,
		),

2.用has_many,has_one进行关联

名称 说明 默认值 必须
sdfkey 对应关系在sdf树中的挂载点名
表名 对应的表名
操作 save的操作方式append:只对导入数据做save保存不对数据库原有数据做操作;replace:先删除数据库原有所有相关数据 再对导入数据做save;contrast:和数据数原有数据做比对 导入数据原有数据存在库中做update 不存在insert 数据库存在未导入数据delete append
字段关联 本表字段^关联表字段 2表之间 本表主键 与对应表dbschema中”type=>table:本表名”字段不能关联用此方法标识对应关系
var $has_many = array(
    'sdfkey'=>'表名(@app名):操作:字段关联',
		....
);

….has_many  标明表的对外一对多

<?php
class b2c_mdl_goods extends dbeav_model{
    var $has_many = array(
        'product' => 'products:contrast',
        'rate' => 'goods_rate:replace:goods_id^goods_1',
        'keywords'=>'goods_keywords:replace',
        'images' => 'image_attach@image:contrast:goods_id^target_id',
        'tag'=>'tag_rel@desktop:replace:goods_id^rel_id',
    );
    var $has_one = array(

    );

 

….has_one   标明表对外为一对一

———————————–$subsdf配置详解——————————————-

为什么要配置subSdf?

一个主表可以关联多个子表,但是有些操作则只需要对一个主表和其中关联的一个子表进行操作。那么则需要定义subSdf来进行过滤

var $subSdf = array(
    'key'=>array('field' subsdf),
    ':Foreign key'=>array(
        'field',subsdf
    ),
)
名称 说明
key has_many/has_one定义键值 支持xpath语法
field 子表所需输出字段
Foreign key dbschema定义的外键表名 :前有string可以自定义外联表数据在sdf树中的键名
subsdf 子表subsdf

注意:

1.default 为默认,可以自定义别的写法 basic,simple等等等
2.如果 $subSdf 未定义则为$has_many,$has_one的集合

贴上Ecstore最复杂的多表关联goods模型的代码

  var $has_many = array(
		//关联products表(只对导入数据保存)
        'product' => 'products:append',
		//关联goods_rate表,清空原数据,直接save  
		//1.rate:是数组的下标可自定义,2.goods_rate为表明,3.replace为save的保存模式,
		//4.goods_id^goods_1 为goods表里的goods_id 等于 goods_rate表里的goods_1 (本表字段^关联表字段)
		//本表主键 与 对应表dbschema中"type=>table:本表名"字段 不能关联用此方法标识对应关系(默认不写)
        'rate' => 'goods_rate:replace:goods_id^goods_1',
		//关联keywords表,清空原数据,直接save
        'keywords'=>'goods_keywords:replace',
		//@image 调用其他app要用@app名称
        'images' => 'image_attach@image:contrast:goods_id^target_id',
        'tag'=>'tag_rel@desktop:replace:goods_id^rel_id',
    );
	
    var $subSdf = array(
	//default 为默认,如果定义之后,即使不调用default也会按照default走
	//如果不存在default,则subsdf为has_one has_many的结婚
            'default' => array(
				//keywords 代表上边has_many里边的数据关系定义,同时也是输出数组的key
                'keywords'=>array('*'),
				/*----product 和 keywords同理
				(price/member_lv_price) 这也是一个subsdf,斜杠代表输出路径的层级关系
			
				写上(price/member_lv_price) 为什么就能关联到其他表呢。????
				
		
				可是(price/member_lv_price)这个值是随便写的吗?答案:NO,打开products的mdl文件。你就会神奇的发现~~
				原来(外联表数据在sdf树中的键名)还真是 price/member_lv_price!!!!
					var $has_many = array(
					'price/member_lv_price' => 'goods_lv_price:contrast',
				);---- 若删除当前的sub定义,将会失效,同理删除关联表的定义也将会失效*/ 
				
                'product'=>array(
                    '*',array(
                        'price/member_lv_price'=>array('*')
                    )
                ),
				
				//为什么要写冒号????
				//因为他们不在has_many里边有定义,所以要用冒号单独关联到他们
				
                ':goods_type'=>array(
                    '*'
                ),
                ':goods_cat'=>array(
                    '*'
                ),
				
				//看上述详细介绍---Foreign key 《dbschema定义》的外键表名 ///////(:冒号)前有string 是 自定义 外联表数据在sdf树中的键名
				//dbschema定义的模式就是 type="table:xxx@ooo" ,
				//例如jack:image  输出的数组键值是jack,而不是image
				
  				
                'images'=>array(
                    '*',array(
                        ':image'=>array('*')
                    )
                )
            ),
			//delete名字自定义,删除的时候所执行的subsdf。
            'delete' => array(
                'keywords'=>array('*'),
                'product'=>array(
                    '*',array(
                        'price/member_lv_price'=>array('*')
                    )
                ),
                'images'=>array(
                    '*'
                 )
            )
        );
		

未经允许不得转载:PHP之窗 » dbeav 多表关联详解

分享到:更多 ()

评论 3

  • (必填)
  • 14 + 15 = ?(必填)
  1. #2

    ····

    Jon snow2年前 (2016-12-14)回复
  2. #1

    111111111

    Jon snow2年前 (2016-12-14)回复

产品与解决方案,顶尖的服务!!

联系我们