/********
------
模型:
------
/********
一、定義:******************************
模型名(類名) 約定對應數據表(假設數據庫的前綴定義是 think_)
UserModel think_user
UserTypeModel think_user_type
protected $tableName = 'categories'; //改變默認表
protected $trueTableName = 'top_depts'; //改變默認表及前綴
protected $dbName = 'top'; //改變默認數據庫
二、實例化:*****************************
1、實例化基礎模型
$user = new Model('User');
或
$user = M('User');
2、實例化其他公司模型類
$User = new CommonModel('User');
或
$User = new CommonModel('User','think_','db_config');
或
$User = M('CommonModel:User','think_','db_config');
3、實例化用戶自定義模型類
D()方法
4、實例化空模型
5、跨庫操作
$User = M('user.User', 'other_'); //實例化user數據庫的other_user表
三、字段定義:*****************************
1、字段緩存文件在Data/_fields目錄下面
可以通過下面配置關閉字段緩存
'DB_FIELDS_CACHE'=>false
2、若想不使用字段緩存功能,可以在模型類中添加fields屬性即可,如
class UserModel extends Model{
protected $fields =array('id','username','email','_pk'=>'id','_autoinc'=>true);
}
3、獲取字段信息
$fields = $User->getDbFields();
4、獲取數據表主鍵
$pk = $Model->getPk();
5、字段映射
6、自動驗證(字段驗證)
驗證格式:array(驗證字段, 驗證規則, 錯誤提示, [驗證條件]附加規則,驗證時間])
示例:
protected $_validate = array(
array('verify','require','驗證碼必須!'), //默認情況下用正則進行驗證
array('name','','帳號名稱已經存在!',0,'unique',1), // 在新增的時候驗證name字段是否唯一
array('value',array(1,2,3),'值的範圍不正確!',2,'in'), // 當值不爲空的時候判斷是否在一個範圍內
array('repassword','password','確認密碼不正確',0,'confirm'), // 驗證確認密碼是否和密碼一致
array('password','checkPwd','密碼格式不正確',0,'function'), // 自定義函數驗證密碼格式
);
$User = D("User"); // 實例化User對象
$validate = array(
array('verify','require','驗證碼必須!'), // 僅僅需要進行驗證碼的驗證);
$User-> setProperty("_validate",$validate);
$User->create(); //該機制需要使用create()方法才能生效
6、自動完成(字段自動完成)
在Model類定義$_auto屬性,可以完成數據自動處理,默認值、數據過濾及其他系統寫入字段;該屬性是由多個填充因子
組成的數組。
填充因子格式:array(填充字段, 填充內容, [填充條件, 附加規則])
示例:
protected $_auto = array (
array('status','1'), // 新增的時候把status字段設置爲1
array('password','md5',1,'function') , // 對password字段在新增的時候使md5函數處理
array('name','getName',1,'callback'), // 對name字段在新增的時候回調getName方法
array('create_time','time',2,'function'), // 對create_time字段在更新的時候寫入當前時間戳
);
$auto = array (
array('password','md5',1,'function') // 對password字段在新增的時候使md5函數處理
);
$User-> setProperty("_auto",$auto);
$User->create(); //該機制需要使用create()方法才能生效
四、屬性訪問:*****************************
1、對象方式訪問, find(),data(),create()方法可以
$User = D('User');
$User->find(1);
echo $User->name; //獲取屬性
$User->name = 'TP'; //設置屬性值
2、數據方式
$User = D('User');
$User->find(1);
echo $User['name']; //獲取屬性
$User['name'] = 'TP'; //設置屬性值
五、查詢語句
1、查詢方式
普通字符串作爲查詢條件 - 安全性需要自己考慮
$User->where('type=1 and status=1')->select();
數組作爲查詢條件
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
$condition['_logic'] = 'OR'; //修改字段間的邏輯關係是 邏輯或(OR),默認爲AND
$User->where($condition)->select();
對象方式來查詢
condition->name = 'thinkphp';
$condition->status= 1;
$User->where($condition)->select();
2、表達式查詢
上面的查詢方式都是簡單的相等判斷,可以使用更多的試查詢,格式
$map['字段名'] = array('表達式', '查詢條件');
表達式 含義
EQ =
NEQ <>
GT >
EGT >=
LT <
ELT <=
LIKE like
[NOT] BETWEEN (不在)區間查詢
[NOT] IN (不在)IN查詢
EXP 表達式查詢,支付SQL語法
| 不同字段相同的查詢條件
& 不同字段不同的查詢條件
區間查詢
示例:
EQ :等於(=)
例如:$map['id'] = array('eq',100);
和下面的查詢等效
$map['id'] = 100;
表示的查詢條件就是 id = 100
LIKE: 同sql的LIKE
例如:$map['name'] = array('like','thinkphp%');
查詢條件就變成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS參數的話,某些字段也會自動進行模糊查詢。例如設置了:
'DB_LIKE_FIELDS'=>'title|content'
的話,使用
$map['title'] = 'thinkphp';
查詢條件就會變成 name like '%thinkphp%'
[NOT] IN: 同sql的[not] in ,查詢條件支持字符串或者數組,例如:
$map['id'] = array('not in','1,5,8');
和下面的等效:
$map['id'] = array('not in',array('1','5','8'));
查詢條件就變成 id NOT IN (1,5, 8)
EXP:表達式,支持更復雜的查詢情況
例如:
$map['id'] = array('in','1,3,8');
可以改成:
$map['id'] = array('exp',' IN (1,3,8) ');
exp查詢的條件不會被當成字符串,所以後面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。查詢
表達式不僅可用於查詢條件,也可以用於數據更新,例如:
$User = M("User"); // 實例化User對象
// 要修改的數據對象屬性賦值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據條件保存修改的數據
另有:
實現不同字段相同的查詢條件
$map['name|titlle'] = 'thinkphp';
name = 'thinkphp' OR title = 'thinkphp'
實現不同字段不同的查詢條件; '_multi'=>true必須加在數組的最後,表示當前是多條件匹配
$map['status&score&title'] = array('1', array('gt','0'), 'thinkph', '_multi'=>true);
status= 1 AND score >0 AND title = 'thinkphp'
區間查詢:一個字段不同查詢條件
map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查詢條件是:
(`id` > 1) AND (`id` < 10)
$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'),'ThinkPHP','or');
最後的查詢條件是:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')
3、組合查詢
各種查詢方式可以混合使用
組合查詢的主體還是採用數組方式查詢,只是加入了一些特殊的查詢支持,包括字符串模式查詢(_string)、複合查詢
(_complex)、請求字符串查詢(_query)。
字符串模式查詢(_string):
$User = M("User"); // 實例化User對象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();
最後得到的查詢條件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
請求字符串查詢(_query):
類似於URL傳參的方式,可以支持簡單的條件相等判斷。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
得到的查詢條件是:`id`>100 AND (`status` = '1'OR `score` = '100')
複合查詢(_complex):
複合查詢相當於封裝了一個新的查詢條件,然後併入原來的查詢條件之中,所以可以完成比較複雜的查詢條件組裝。
例如:
$where['name'] = array('like','%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',1);
查詢條件是
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
複合查詢使用了_complex作爲子查詢條件來定義,配合之前的查詢方式,可以非常靈活的制定更加複雜的查詢條件。
4、統計查詢
方法 說明
count 統計數量
max 獲取最大值
min 獲取最小值
avg 獲取平時值
sum 獲取總分
5、SQL查詢
原生的SQL語句查詢
query 執行SQL查詢操作
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->query("select * from think_user where status=1");
execute 執行更新和寫入數據的SQL操作
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1");
6、快速查詢方法
find()
getBy+()
getFieldBy+()
top+()
7、子查詢
8、查詢鎖定
9、字段排除
10、事務支持
------
模型:
------
/********
一、定義:******************************
模型名(類名) 約定對應數據表(假設數據庫的前綴定義是 think_)
UserModel think_user
UserTypeModel think_user_type
protected $tableName = 'categories'; //改變默認表
protected $trueTableName = 'top_depts'; //改變默認表及前綴
protected $dbName = 'top'; //改變默認數據庫
二、實例化:*****************************
1、實例化基礎模型
$user = new Model('User');
或
$user = M('User');
2、實例化其他公司模型類
$User = new CommonModel('User');
或
$User = new CommonModel('User','think_','db_config');
或
$User = M('CommonModel:User','think_','db_config');
3、實例化用戶自定義模型類
D()方法
4、實例化空模型
5、跨庫操作
$User = M('user.User', 'other_'); //實例化user數據庫的other_user表
三、字段定義:*****************************
1、字段緩存文件在Data/_fields目錄下面
可以通過下面配置關閉字段緩存
'DB_FIELDS_CACHE'=>false
2、若想不使用字段緩存功能,可以在模型類中添加fields屬性即可,如
class UserModel extends Model{
protected $fields =array('id','username','email','_pk'=>'id','_autoinc'=>true);
}
3、獲取字段信息
$fields = $User->getDbFields();
4、獲取數據表主鍵
$pk = $Model->getPk();
5、字段映射
6、自動驗證(字段驗證)
驗證格式:array(驗證字段, 驗證規則, 錯誤提示, [驗證條件]附加規則,驗證時間])
示例:
protected $_validate = array(
array('verify','require','驗證碼必須!'), //默認情況下用正則進行驗證
array('name','','帳號名稱已經存在!',0,'unique',1), // 在新增的時候驗證name字段是否唯一
array('value',array(1,2,3),'值的範圍不正確!',2,'in'), // 當值不爲空的時候判斷是否在一個範圍內
array('repassword','password','確認密碼不正確',0,'confirm'), // 驗證確認密碼是否和密碼一致
array('password','checkPwd','密碼格式不正確',0,'function'), // 自定義函數驗證密碼格式
);
$User = D("User"); // 實例化User對象
$validate = array(
array('verify','require','驗證碼必須!'), // 僅僅需要進行驗證碼的驗證);
$User-> setProperty("_validate",$validate);
$User->create(); //該機制需要使用create()方法才能生效
6、自動完成(字段自動完成)
在Model類定義$_auto屬性,可以完成數據自動處理,默認值、數據過濾及其他系統寫入字段;該屬性是由多個填充因子
組成的數組。
填充因子格式:array(填充字段, 填充內容, [填充條件, 附加規則])
示例:
protected $_auto = array (
array('status','1'), // 新增的時候把status字段設置爲1
array('password','md5',1,'function') , // 對password字段在新增的時候使md5函數處理
array('name','getName',1,'callback'), // 對name字段在新增的時候回調getName方法
array('create_time','time',2,'function'), // 對create_time字段在更新的時候寫入當前時間戳
);
$auto = array (
array('password','md5',1,'function') // 對password字段在新增的時候使md5函數處理
);
$User-> setProperty("_auto",$auto);
$User->create(); //該機制需要使用create()方法才能生效
四、屬性訪問:*****************************
1、對象方式訪問, find(),data(),create()方法可以
$User = D('User');
$User->find(1);
echo $User->name; //獲取屬性
$User->name = 'TP'; //設置屬性值
2、數據方式
$User = D('User');
$User->find(1);
echo $User['name']; //獲取屬性
$User['name'] = 'TP'; //設置屬性值
五、查詢語句
1、查詢方式
普通字符串作爲查詢條件 - 安全性需要自己考慮
$User->where('type=1 and status=1')->select();
數組作爲查詢條件
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
$condition['_logic'] = 'OR'; //修改字段間的邏輯關係是 邏輯或(OR),默認爲AND
$User->where($condition)->select();
對象方式來查詢
condition->name = 'thinkphp';
$condition->status= 1;
$User->where($condition)->select();
2、表達式查詢
上面的查詢方式都是簡單的相等判斷,可以使用更多的試查詢,格式
$map['字段名'] = array('表達式', '查詢條件');
表達式 含義
EQ =
NEQ <>
GT >
EGT >=
LT <
ELT <=
LIKE like
[NOT] BETWEEN (不在)區間查詢
[NOT] IN (不在)IN查詢
EXP 表達式查詢,支付SQL語法
| 不同字段相同的查詢條件
& 不同字段不同的查詢條件
區間查詢
示例:
EQ :等於(=)
例如:$map['id'] = array('eq',100);
和下面的查詢等效
$map['id'] = 100;
表示的查詢條件就是 id = 100
LIKE: 同sql的LIKE
例如:$map['name'] = array('like','thinkphp%');
查詢條件就變成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS參數的話,某些字段也會自動進行模糊查詢。例如設置了:
'DB_LIKE_FIELDS'=>'title|content'
的話,使用
$map['title'] = 'thinkphp';
查詢條件就會變成 name like '%thinkphp%'
[NOT] IN: 同sql的[not] in ,查詢條件支持字符串或者數組,例如:
$map['id'] = array('not in','1,5,8');
和下面的等效:
$map['id'] = array('not in',array('1','5','8'));
查詢條件就變成 id NOT IN (1,5, 8)
EXP:表達式,支持更復雜的查詢情況
例如:
$map['id'] = array('in','1,3,8');
可以改成:
$map['id'] = array('exp',' IN (1,3,8) ');
exp查詢的條件不會被當成字符串,所以後面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。查詢
表達式不僅可用於查詢條件,也可以用於數據更新,例如:
$User = M("User"); // 實例化User對象
// 要修改的數據對象屬性賦值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據條件保存修改的數據
另有:
實現不同字段相同的查詢條件
$map['name|titlle'] = 'thinkphp';
name = 'thinkphp' OR title = 'thinkphp'
實現不同字段不同的查詢條件; '_multi'=>true必須加在數組的最後,表示當前是多條件匹配
$map['status&score&title'] = array('1', array('gt','0'), 'thinkph', '_multi'=>true);
status= 1 AND score >0 AND title = 'thinkphp'
區間查詢:一個字段不同查詢條件
map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查詢條件是:
(`id` > 1) AND (`id` < 10)
$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'),'ThinkPHP','or');
最後的查詢條件是:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')
3、組合查詢
各種查詢方式可以混合使用
組合查詢的主體還是採用數組方式查詢,只是加入了一些特殊的查詢支持,包括字符串模式查詢(_string)、複合查詢
(_complex)、請求字符串查詢(_query)。
字符串模式查詢(_string):
$User = M("User"); // 實例化User對象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();
最後得到的查詢條件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
請求字符串查詢(_query):
類似於URL傳參的方式,可以支持簡單的條件相等判斷。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
得到的查詢條件是:`id`>100 AND (`status` = '1'OR `score` = '100')
複合查詢(_complex):
複合查詢相當於封裝了一個新的查詢條件,然後併入原來的查詢條件之中,所以可以完成比較複雜的查詢條件組裝。
例如:
$where['name'] = array('like','%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',1);
查詢條件是
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
複合查詢使用了_complex作爲子查詢條件來定義,配合之前的查詢方式,可以非常靈活的制定更加複雜的查詢條件。
4、統計查詢
方法 說明
count 統計數量
max 獲取最大值
min 獲取最小值
avg 獲取平時值
sum 獲取總分
5、SQL查詢
原生的SQL語句查詢
query 執行SQL查詢操作
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->query("select * from think_user where status=1");
execute 執行更新和寫入數據的SQL操作
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1");
6、快速查詢方法
find()
getBy+()
getFieldBy+()
top+()
7、子查詢
8、查詢鎖定
9、字段排除
10、事務支持