多表连接

插入

例子

  • 表结构:

    会员表members(member_id,password,name,email,...),会员详细信息表member_object('member_id','sex',msn,qq,...),

  • 需求
        1)在会员注册时,需要在两个表中插入对应数据成功,注册才成功。
        2)需要批量导入会员数据到members表和member_object表
    
  • 解决
    • 问题一方法一 多表插入可以用到dbeav中的save方法来进行操作。/ecos/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方法,
      

更新

例子

  • 表结构

    员表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来进行实现
      

查询

例子

  • 表结构

    商品表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提供的多表连查功能/ecos/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来进行实现

删除

例子

  • 表结构

    会员表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方法/ecos/advance/dbeav/dbeav.html#id14
          在dbeav中的delete会在删除主表的时候把关联子表的数据删除。
      
    • 问题二
          delete条件限制
              1)把delete的条件作为主表的条件进行删除,再把关联字段的数据作为子表的删除条件
              2)子表数据不能作为主表删除的条件
      
      通过限制条件我们知道,对于第二个问题则不能用delete来进行删除,那么这个时候则需要自己写sql来进行删除

內容目录

上一个主题

事务处理

下一个主题

多文件上传

快速搜索

输入相关的模块,术语,类或者函数名称进行搜索