base_db_model

base_db_model为Ecos的最基本的model基类

如何创建自己的model

model的命名规则

{$app_id}_mdl_{$mod_path}

例如:
model: b2c_mdl_cart_objects
$app_id = b2c
$mod_path = cart/objects.php

model存放位置

app/{$app_id}/model/{mod_path}/

例如:
b2c_mdl_cart_objects
存放位置: app/b2c/model/cart/objects.php

创建自己的model

<?php
class base_mdl_apps extends base_db_model{
   ...
}

如何取得model对象

  • 获取本app的model

    在本app的model/controller里如果需要获取本app的model对象时可用以下方法

    <?php
    $model 
    $this->app->model();
  • 获取其他app的model
    <?php
    $model 
    app::get('b2c')->model($model);

如何在model中获取数据库操作对象

有两种方式:

  • 通过调用基类成员变量$db

    例如:

    <?php
    class notebook_mdl_notebooks extends base_db_model {
       function 
    show_one($goods_id){
          ...
          
    $sql sprintf('select name from sdb_b2c_goods where goods_id=%s'$goods_id);
          
    $result $this->db->select($sql);
          return 
    $result;
          ...
       }
    }
  • 通过kernel::database()直接获取数据库操作对象;
    <?php
    class notebook_mdl_notebooks extends base_db_model {
       function 
    show_one($goods_id){
          ...
          
    $sql sprintf('select name from sdb_b2c_goods where goods_id=%s'$goods_id);
          
    $result kernel::database()->select($sql);
          return 
    $result;
          ...
       }

默认的数据库操作类为base_db_connections

要替换默认的数据库操作类, 可以在config/config.php中添加/修改

define(DATABASE_OBJECT, 'db_class_name');

函数接口

filter

filter顾名思义为过滤器. 当使用base_db_model所供给的函数getList/count/delete时, 都会隐性调用filter函数, 进行过滤.

一个简单的直观感觉

<?php
$filter 
= array(
    
'sex' => 'male',
    
'age' => array (234554)
    );
$this->delete($filter);

可猜测以上代码的意图, 删除性别为男性, 年龄为23或45或54的记录.

<?php
clsss base_db_model 
implements base_interface_model{
    ...
    public function 
delete($filter){
        
$sql 'DELETE FROM `'.$this->table_name(1).'` where '.$this->filter($filter);
        if(
$this->db->exec($sql$this->skipModifiedMark)){
            return 
true;
        }else{
            return 
false;
        }
    }
    ...
}

看一下delete函数代码,可知filter将返回sql语句中where子句的部分

在上例中, filter函数将返回

 sex='male' and (age=23 or age=45 or age=54)
base_db_model提供的filter函数只做最基本的处理, 将$filter数组(参数), 数组单元里值为非数组的做and 拼接, 数组单元里值为数组的做 or拼接.

如果你有特殊需求, 比方说你要处理一个虚拟列, 可以在你些的model里重载filter函数

<?php
class notebook_mdl_notebooks extends base_db_model {
   ...
   function 
filter($filter){
      if (isset(
$filter['_double_age']){
           
$where sprintf(' age=%s and ');
      }
      unset(
$filter['_test']);

      
$return $where.parent::filter()
   }
   ...
}
参数
	array $filter 过滤条件
返回
	string 返回sql语句where子句

table_name

获取此model对应表的表名

<?php
class notebook_mdl_notebooks extends base_db_model {
   ...
   
//注意,此处方法名不可与父类方法同名
   
function tablename(){
      
var_dump($this->table_name(true));  //完整表名
      
var_dump($this->table_name(false));  //short表名
   
}
   ...
}

app::get('notebook')->model('notebooks')->tablename();
sdb_notebook_notebooks
notebooks
参数
	bool $real 是否要完整的表名
返回
	表名

getList

获取model对应表的单/多行数据, 可根据需要重载

$orderby参数设置排序方式, 会拼接到order by语句后, 可以是数组也可以是字符串. 数组只能设置一种排序方式, 字符串更为灵活

数组:

$orderby = array('name', 'desc');

字符串:

$orderby = 'name desc, id asc, p_order';

例如:
var_dump($this->getList('name, sex', array(), 0, 3,'name desc,id asc'));
输出
array(
	0 => array('name' => 'laoda', sex=>'male',
	1 => array('name' => 'laoer', sex=>'femail'
	)

参数
	string $cols 设置要取哪些列的数据
	array $filter 过滤条件,默认为array()
	integer $offset 偏移量,从select出的第几条数据开始取
	integer $limit 取几条数据, 默认值为-1, 取所有select出的数据
	string/array $orderby 排序方式, 默认为无排序
返回
	array 二维数组, 多行数据, 每行数据对应表的以行, 所取列由$cols参数控制

tidy_data

多行数据, 在dbschema的type定义为serialize的数据, unserialize.

通过getList取出的数据, 已经经过此处理. 此种处理通常应用于直至通过db calss select的数据

参数:
	array $rows 通过getList出的数据
	array $cols 需要取的列

count

通过过滤器,取得对应表的数据行数

参数:
	array $filter 过滤条件
返回:
	integer 行数
app::get('notebook')->model('notebooks')->count($filter); //根据$filter条件

get_schema

获取数据库定义文件:$app/dbschema/$model_name定义的dbschema数组

返回:
	array dbschema定义文件定义的数组

searchOptions

返回在dbschema定义文件中定义为搜索项的列(列属性里定义有searchtype), 详细可见dbschema数据库表定义文件. 可以在自己的model中进行重载.

返回:
	array 提供搜索的列

replace

更新model所对应表的多行数据

参数:
	array $data 一维数组, 代表model对应表的一行数据
	array $filter 过滤条件

update

更新model所对应表的多行数据

$data = array(
            'name'=>'wuwei',
            'sex'=>'male',
        );
$filter = array('id'=>10);
$this->update($data,$filter);
参数:
	array $data 一维数组, 代表model对应表的一行数据
	array $filter 过滤条件
返回
    成功    更新影响的条数
    失败    false

save

保存数据,如果需要保存的数据中的字段存在主键,就会以主键为条件,执行更新操作。否则进行插入操作。

$data = array(
            'id'=>10,
            'name'=>'sunjingrong',
            'sex'=>'male',
        );
$this->save($data);
参数
    array   $data   新增/更新行数据
返回
    成功    1
    失败    false

insert

插入单行数据, 会根据dbschema的type做转义处理

$data = array('name' => 'bryant', 'sex' => 'male');
$this->insert($data);
参数
    array $data 新增行数库
返回
    bool|integer    如果插入成功且此表只有一个主键返回插入的主键ID号,
                    如果插入成功且此表有多个主键则返回true,失败返回false

delete

删除指定单/多行

$filter = array('id'=>10);
$this->delete($filter);
参数
    array $filter 过滤条件
返回
    bool 删除成功或失败