多表连接
插入
例子
- 表结构:
会员表members(member_id,password,name,email,...),会员详细信息表member_object('member_id','sex',msn,qq,...),
- 需求
1)在会员注册时,需要在两个表中插入对应数据成功,注册才成功。 2)需要批量导入会员数据到members表和member_object表
- 解决
- 问题一方法一 多表插入可以用到dbeav中的save方法来进行操作。http://www.ec-os.net/advance/dbeav/dbeav.html#id16
配置 var $has_many = array('member_object'=>'member_object:append:member_id^member_id');
方法二 先把数据插入到members表,在得到member_id后再把数据插入到member_object在dbeav中的delete会在删除主表的时候把关联子表的数据删除。如果在删除主表的数据后并不需要把关联的子表的数据删除, 那么则不能将两个表进行关联,这个时候则在代码中实现插入两遍即可。
方法三 自己写sql,实现多表插入在能够使用dbeav进行表关联的时候推荐使用方法一,不能则推荐使用方法二 对于数据一致性要求严格的可以使用事务处理
- 问题二
在ECOS中没有提供方法进行批量的多表插入数据,dbeav中的save方法是单条数据进行插入,那么在进行批量的时候则 使用循环save方法,
- 问题一方法一 多表插入可以用到dbeav中的save方法来进行操作。http://www.ec-os.net/advance/dbeav/dbeav.html#id16
更新
例子
- 表结构
员表members(member_id,password,name,email,enable,...),会员详细信息表member_object('member_id','sex',msn,qq,...),
- 需求
1)在会员修改信息时,需要在两个表中对应的数据信息更新。 2) 将会员中所有sex<18的会员的members表中enable字段改为enable=false禁用
- 解决
- 问题一对于这样的单条数据的更新,而且知道要更新的members表的member_id,可以使用dbeav的save方法进行更新,save会根据has_many(has_one)的操作配置来判断save是插入还是更新处理
配置 var $has_many = array('member_object'=>'member_object:contrast:member_id^member_id');
- 问题二save主要是作为插入保存数据的方法,对于这个的更新来说并不能实现。而如果两个不进行关联操作更新也是比较麻烦的,需要先在member_object表中查找出符合条件的会员,再到members表中去更新。
那么对于有这样需求的则写sql来进行实现
- 问题一对于这样的单条数据的更新,而且知道要更新的members表的member_id,可以使用dbeav的save方法进行更新,save会根据has_many(has_one)的操作配置来判断save是插入还是更新处理
查询
例子
- 表结构
商品表goods(goods_id,goods_type_id,name,marketable,...)商品类型表goods_type(goods_type_id,type_name,...)
- 需求
1)根据查询条件goods_id=1,查询到对应商品的类型的名字type_name 2)根据查询条件marketable=true(上架)并且商品类型是type_name=`笔记本`,查询到对应的商品
- 解决
- 问题一 可以通过dbeav中的dump进行查询在ECOS的dbeav中的dump提供的多表连查功能http://www.ec-os.net/advance/dbeav/dbeav.html#id13
配置 var $has_many = array('goods_type'=>'goods_type:append:goods_type_id^goods_type_id'); var $subSdf = array('default'=>array('*')); 使用dump查询: $this->app->model('goods')->dump('array(goods_id'=>1'),'*','default');
- 问题二 对于第二个问题来说并不能使用dump
dump的使用限制: 1) 条件的限制,对于dump来说条件能设置的条件只能针对与主表,dump会先根据条件在主表中查找出一条符合 条件的数据,再将这条数据中的关联字段的数据作为关联子表的查询条件,在子表中进行查询,最后返回数据 2) 返回数据条数的限制,主表根据条件只能返回一条数据,关联子表没有限制
根据dump的使用限制可以看出,对于第二个问题则不能使用dbeav中的dump进行查询,那么这个就只能自己写sql来进行实现
- 问题一 可以通过dbeav中的dump进行查询在ECOS的dbeav中的dump提供的多表连查功能http://www.ec-os.net/advance/dbeav/dbeav.html#id13
删除
例子
- 表结构
会员表members(member_id,password,name,email,enable,...),会员详细信息表member_object('member_id','sex',msn,qq,...),
- 需求
1)根据member_id删除一个用户 2)把满足members表中enable=true并且member_object表中sex<18的会员信息删除
- 解决
- 问题一关联多表进行删除,可使用dbeav的delete方法http://www.ec-os.net/advance/dbeav/dbeav.html#id14
在dbeav中的delete会在删除主表的时候把关联子表的数据删除。
- 问题二
delete条件限制 1)把delete的条件作为主表的条件进行删除,再把关联字段的数据作为子表的删除条件 2)子表数据不能作为主表删除的条件
通过限制条件我们知道,对于第二个问题则不能用delete来进行删除,那么这个时候则需要自己写sql来进行删除
- 问题一关联多表进行删除,可使用dbeav的delete方法http://www.ec-os.net/advance/dbeav/dbeav.html#id14