thinkPHP學習小結

/********
------
模型:
------
/********


一、定義:******************************

模型名(類名)    約定對應數據表(假設數據庫的前綴定義是 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、事務支持

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章