ThinkPHP查詢數據與CURD

1、建立鏈接php

在配置文件中使用以下配置:mysql

//mysql 定義
    /*
      'db_type' => 'mysql',
      'db_host' => 'localhost',
      'db_user' => 'root',
      'db_pwd' => '',
      'db_port' => 3306,
      'db_name' => 'test', */
    //PDO專用定義
    //PDO鏈接方式
    'DB_TYPE' => 'mysql', // 數據庫類型
    'DB_USER' => 'root', // 用戶名
    'DB_PWD' => '', // 密碼
    'DB_PREFIX' => '', // 數據庫表前綴
    'DB_DSN' => 'mysql:host=localhost;dbname=test;charset=UTF8',

注意在ThinkPHP3.2.3,默認全部數據庫都是基於PDO實現的,因此DB_TYPE再也不支持PDO設置,必須採用實際的數據庫類型設置。sql

*爲了在調試時能夠顯示SQL語句,這裏能夠加上如下配置thinkphp

//頁面Trace
    'SHOW_PAGE_TRACE' => true,

 

2、建立控制器並建立相應方法。數據庫

3、建立數據庫鏈接類。一種是經過基類Model建立,一種是建立自定義模塊。數組

經過基類Model建立:緩存

//Model基類
        $user = new Model();
        $user = new Model("user");
        $user = M();//等同於new Model();
        $user = M("user");//等同於new Model("user")
        $user = new Model("user","","mysql://root:@localhost/test");//第一個參數爲表名,第二個參數爲表名前綴

經過自定義模塊:安全

$user = new \Home\Model\UserModel();
$user = D("User");

*自定義模塊時,若要使用不一樣的表,可在模塊中定義如下屬性:函數

//修改前綴
protected $tablePrefix = "tp_"
//修改表名
protected $tableName = "abc";
//一塊兒修改
protected $trueTableName = "tp_abc";
//修改數據庫名
protected $dbName = "aaa";

 

4、查詢數據url

一、基本查詢的三種方式:

//select所有顯示,find顯示一條
$user = M('User');
//-------字符串方式
var_dump($user->where('id=1 AND user="蠟筆小新"')->select());
//-------數組索引方式 默認是AND(高效)
$condition['id'] = 2;
$condition['username'] = 'llicat';
//改變AND爲OR
$condition['_logic'] = 'OR';
//-------對象條件查詢  PHP內置類在根目錄下找   '\'
$condition = new \stdClass();
$condition->id = 1;
$condition->username='admin';
$condition->_logic ='or';
var_dump($user->where($condition)->select());

二、表達式查詢:eq,neq,gt等

$user = M('user');
$map['id']= array('eq','1,3');//eq,neq,gt,egt,lt...具體看手冊  eq等於  等於1和2?再加一個數組的形式不能用   用逗號 !1,3
$map['username']=array('like','%l%');//notlike 不用空格
$map['username']=array('like',array('%l%','%a%'),'and');//最後一個參數不寫默認是OR
//區間查詢
$map['id']=array('between','2,4');
$map['id']=array('between',array('1','3'));//或者這樣  not between 須要空格
$map['id']=array('in','2,4');//array也行 not in空格
//EXP:自定義
$map['id'] = array('exp','=1 AND username="llicat"');
$map['id'] = array('exp','in (1,2,3)');
$map['username'] = array('exp','="123"');
$map['_logic']='OR';
var_dump($user->where($map)->select());
        

三、快捷查詢:

$user = M('user');
$map['username|password'] = 'llicat';// 相同查詢條件|:or  &:and
$map['username&password'] = array('llicat','123456','_multi'=>TRUE);//multi設置一一對應,否則username會對應多個
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);//和表大會組合 而且能夠多個
var_dump($user->where($map)->select());

四、區間查詢

$user = M('user');
$map['id'] = array(array('gt',1),array('lt',3));//用AND:不加第三個參數。   用OR:第三個參數 'OR'
var_dump($user->where($map)->select());

五、組合查詢(索引數組的擴展)

//字符串查詢(_string) 複合查詢(_complex) 請求字符串查詢(_query)
$user = M('user');
//-------------字符串查詢擴展
$map['id'] = array('eq',1);
$map['_string'] = 'username="llicat" AND password="123456"';//這種方式不太安全,生成的SQL語句中字段名沒反單引號
$map['_logic'] = 'OR';//OR
//-------------請求字符串查詢擴展
$map['id'] = array('eq',1);
$map['_query'] = 'username=llicat&password=123456';//有反單引號,較安全,推薦,也能夠加_logic
//-------------複合查詢擴展
$map['id'] = array('eq',1);
$where['id'] = 2;
$map['_complex'] = $where;
$map['_logic'] ='OR';
var_dump($user->where($map)->select());

六、統計查詢:用於統計sum、avg、min、max、count等

var_dump($user->count());//括號裏寫'email'這種選擇某個字段,若是該字段可爲空,且有空,則不計算空
var_dump($user->min('id'));//sum、avg等等

七、動態查詢

var_dump($user->getByUsername('llicat'));
var_dump($user->getFieldByUsername('llicat',id));//根據username找相對應id

八、SQL查詢:原生SQL查詢,query讀取,execute寫入

var_dump($user->query('SELECT * FROM user'));//根據username找相對應id
var_dump($user->execute("UPDATE user SET username='admin' WHERE id='2'"));//根據username找相對應id

九、連貫操做,更多操做能夠查看ThinkPHP手冊

$user = M('User');
var_dump($user->where('id>1')->order('id ASC')->limit(2)->select());
//用數組方式或者參數方式更好更安全
var_dump($user->select(array('where'=>array('id'=>array('neq',1)),'order'=>'id DESC,username DESC','limit'=>2)));//支持多字段排序
var_dump($user->field('id,username')->select());//只返回指定字段能夠用於查詢、寫入//列名重命名須要as,且field中可使用SQL函數,數組參數
//分頁  limit\page
var_dump($user->limit(0,2)->select());//從0開始顯示前兩等同於page(1,2)
var_dump($user->page(2,2)->select());//每頁顯示倆,顯示第二頁,等同於limit(2,2)
//alias表別名, group having,commentSQL語句註釋,join默認內鏈接 A表 on B表 第二個參數'RIGHT'能夠設置左右鏈接,union合併多個結果集
//distinct去重,cache(true)利用緩存

十、table方法:切換數據表、多表查詢

var_dump($user->table('user')->select());//能夠用簡化表名"__USER__"簡化表名不用帶前綴,table須要帶
var_dump($user->table('__DOC__')->select());
var_dump($user->field('a.id,a.neirong,b.id,b.username')->table('__DOC__ a,__USER__ b')->select());//列名重命名須要as
var_dump($user->field('a.id,a.neirong,b.id,b.username')->table(array("user"=>b,"doc"=>a))->select());

十一、命名範圍

在模型中定義$_scope:

//SQL命名範圍,必須寫$_scope,有下劃線:屬性
//不設置default,默認是顯示全部數據
    protected  $_scope = array(
        'sql1'=>array(
            'where'=>array('id'=>1),
        ),
        'sql2'=>array(
            'order'=>array('id'=>DESC),
            'limit'=>2,
        ),
        'default'=>array(
            'where'=>array('id'=>2),
        ),
    );

在控制器中調用:

//$user = D("User");
//沒下劃線:方法
//scope支持多個調用
var_dump($user->scope('sql1')->scope('sql2')->select());//或者scope('sql1,sql2')
var_dump($user->scope('sql2',array('limit'=>4))->select());//也能夠不指定哪一個sql,直接覆蓋全部
var_dump($user->sql2()->select());//直接調用

 

5、create方法

#create建立數據對象,並無添加數據或者添加表,結果就是提交過來的鍵值對
#建立完成後的數據能夠直接讀取或者修改利用$user->username
#保存在內存中,並無實際寫入到數據庫中,直到使用add 或者save 方法纔會真正寫入數據庫。
$user = M('User');
//--------直接create空,顯示提交過來表單的數據,且默認爲POST,接收get,create($_GET)可是create只獲取數據庫表與表單對應的信息,POST獲取全部
var_dump($user->create());
//--------數據覆蓋
$data['username']='llicat';
$data['password']='123456';
var_dump($user->create($data));
//--------直接用_POST接收
$data['username']=$_POST['username'];
$data['password']=$_POST['password'];
$data['date']=date('Y-md H:i:s');
var_dump($user->create($data));
//--------手工獲取數據,從對象建立新的數據對象
$data = new \stdClass();
$data->username = $_POST['username'];
$data->password = $_POST['password'];
$data->date = date('Y-md H:i:s');
var_dump($user->create($data));
//--------create倆個參數,第一個參數必須制定POST或者GET,第二個爲操做,insert或者update
//沒指定第二個參數時,根據數據源是否包含主鍵判斷修改或者新增,相似merge into
var_dump($user->create($_GET));
var_dump($user->create($_POST,  \Think\Model::MODEL_INSERT));
//--------支持連貫操做field過濾、validate數據自動驗證、auto數據自動完成、token令牌驗證,與域有關
//限制字段
var_dump($user->field('username')->create());//只顯示username
//在模型中限制
$user = D('User');
var_dump($user->create());

限制字段,須要在模型中限制時,能夠在模型中設置以下屬性:

//限制create
protected $insertFields = 'user';
protected $updateFields = 'user';

 

6、數據寫入,add

//=================================數據寫入=================================
$user = M('User');
$data['username']='heiheihei';
$data['password']='xixixi';
$user->add($data);
//----------------------結合create
$user = M("User"); 
//接收表單數據+建立的數據
$data = $user->create();
$data['date']=date('Y-m-d H:i:s');
$user->add($data);
//----------------------連貫操做data,能夠用於寫入多個對象
$user->data($data)->add();
//或者能夠用url格式
$data ='username=heiheihei&password=xixixi';
$user->data($data)->add();

 

7、數據查詢,select

$user=M('user');
//顯示全部
var_dump($user->select());
//顯示第一條
var_dump($user->find());
//獲得指定字段,且只顯示一個
var_dump($user->getField('username'));
//顯示該字段的全部,不僅顯示一個
var_dump($user->getField('username',true));
//顯示多個字段,直接會顯示全部,重複的會被屏蔽!
var_dump($user->getField('username,password'));
//指定分割符號,第二個參數
var_dump($user->getField('id,username,password',':'));
//限制limit 第二個參數
var_dump($user->getField('id,username,password',2));

 

8、更新數據,save

$user=M('user');
$data['username'] = 'oooooooooooo';
$data['password'] = 'xxxxxxxxxxxx';
$map['id']=4;
$user->where($map)->save($data);
//默認主鍵爲條件
$data['id']=5;
$data['username'] = 'tttttt';
$data['password'] = 'qqqqqq';
$user->save($data);
//結合create,id也表單傳過來時
$user->create();
$user->save();//返回值0:沒修改,1:返回成功
//修改某一個字段值
$map['id']=1;
$user->where($map)->setField('username','heihei');
//統計累加累減 count是一個爲int的字段名
$map['id']=1;
$user->where($map)->setInc('count',1);//累加
$user->where($map)->setDec('count',1);//累減

 

9、刪除數據,delete

$user=M('user');
//默認根據主鍵刪除
$user->delete(6);
//----------
$map['id']=6;
$user->where($map)->delete();
//批量刪除多個,根據主鍵要加引號
$user->delete('1,2,3');
//刪除多個條件的
$map['count']=0;
$user->where($map)->order(array('id'=>'DESC'))->limit(1)->delete();
//刪除全部數據,謹慎  1或者true?回頭能夠試試
echo $user->where('1')->delete();//成功返回1 ,沒刪返回0

 

10、ActiveRecord模式,對象化的操做方式

$user=M('user');
//---------------添加
$user->username = 'llicat';
$user->password ='xixixi';
$user->add();
//結合create  處理表達
$user->create();
$user->date =date('Y-md H:i:s');
$user->add();
//----------------查找
//find找到主鍵爲4的值
var_dump($user->find(4));
//找到username=llicat的記錄
var_dump($user->getByUsername('llicat'));
//輸出
$user->getByUsername('llicat');
echo $user->username;
//經過主鍵查詢多個
var_dump($user->select('1,2,3'));
//-----------------修改
//產生了兩條sql,第一條找到數據,第二條修改,且元數據都取出了,效率不高
$user->find(1);
$user->username='xingxing';
$user->save();
//-----------------刪除
//產生兩條sql
$user->find(5);
$user->delete();
//根據主鍵
$user->delete('1,2');

 

11、字段映射:表單名和數據庫的字段名不對稱,用create不能直接獲取,須要用模塊作處理

模塊中:

//字段映射
protected  $_map = array(
    'yonghuming'=>'username',
    'mima'=>'password',
);

控制器中:

//須要用模塊處理
$user = D('user');
var_dump($user->create());

 

 

by llicat

##轉載請註明出處http://www.cnblogs.com/llicat/

相關文章
相關標籤/搜索