Yii1.1 createCommand 命令

熱身訓(xùn)練:

$result = array(
    'id'=>null,
    'val'=>0
);
$row1 = Yii::app()->db->createCommand()->insert('表名', $result);
$id   = Yii::app()->db->getLastInsertID();
$row2 = Yii::app()->db->createCommand()->update('表名', array('val'=>$id) , 'id=:id',array(':id'=>$id));
echo $id;
exit;

常用語句:

<?php
#1. 建立數(shù)據(jù)庫連接 可以使用  try...catch 捕獲可能拋出的異常
$connection=new CDbConnection($dsn,$username,$password);
#   DSN格式
   SQLite: sqlite:/path/to/dbfile
   MySQL: mysql:host=localhost;dbname=testdb
   PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
   SQL Server: mssql:host=localhost;dbname=testdb
   Oracle: oci:dbname=//localhost:1521/testdb

#在配置文件里面修改別名
array(
    'components'=>array(
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'root',
            'password'=>'password',
            'emulatePrepare'=>true,  // needed by some MySQL installations,
          'charset' => 'utf8',
       ),
    ),
)
#然后使用這種方式來建立連接

#然后我們就可以通過 
$connection = Yii::app()->db ;
#訪問數(shù)據(jù)庫連接了。它已經(jīng)被自動激活了,除非我們特意配置了 
#CDbConnection::autoConnect 為 false。
# 通過這種方式,這個單獨(dú)的DB連接就可以在我們代碼中的很多地方共享。
# 如果沒有,你可能需要顯式建立一個連接:
 $connection=new CDbConnection($dsn,$username,$password);
$connection->active=true;  # 建立鏈接之后active為true;
$connection->active=false;  # 關(guān)閉連接

#運(yùn)行SQL
$command=$connection->createCommand($sql);
#SQL修改
$command->text = $newSQL;
#########################################################
#execute()方法用來執(zhí)行 INSERT, UPDATE 和 DELETE 。如果成功,它將返回此執(zhí)行所影響的行數(shù)。
#query() 方法執(zhí)行一條會返回若干行數(shù)據(jù)的 SQL 語句,例如 SELECT。
#如果成功,它將返回一個CDbDataReader 實(shí)例,通過此實(shí)例可以遍歷數(shù)據(jù)的結(jié)果行。
#為簡便起見, (Yii)還實(shí)現(xiàn)了一系列 queryXXX() 方法以直接返回查詢結(jié)果
#如果SQL發(fā)生錯誤,將會拋出一個異常。.
$rowCount   =    $command->execute();                # 執(zhí)行無查詢 SQL
$dataReader =    $command->query();                  # 執(zhí)行一個 SQL 查詢
$rows       =    $command->queryAll();               # 查詢并返回結(jié)果中的所有行
$row        =    $command->queryRow();               # 查詢并返回結(jié)果中的第一行
$column     =    $command->queryColumn();            # 查詢并返回結(jié)果中的第一列
$value      =    $command->queryScalar();            # 查詢并返回結(jié)果中第一行的第一個字段
#########################################################

#獲取查詢結(jié)果
#在生成 CDbDataReader后
#重復(fù)調(diào)用 CDbDataReader::read()
#也可以在 foreach 語言結(jié)構(gòu)中使用 CDbDataReader
####例如####
$dataReader = $command->query();

#方法1 重復(fù)調(diào)用 read() 直到它返回 false
while( ($row = $dataReader->read()) !== false) { ... }
#方法2 使用 foreach 遍歷數(shù)據(jù)中的每一行
foreach($dataReader as $row) { ... }
#方法3 一次性提取所有行到一個數(shù)組
$rows = $dataReader->readAll();

#注意: 
#所有的 queryXXX() 方法會直接返回?cái)?shù)據(jù)
#query()卻不會,返回的是一個CDbDataReader 的實(shí)例

#使用事務(wù)
$transaction= $connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    #其他
    $transaction->commit();
}
catch(Exception $e) # 如果有一條查詢失敗,則會拋出異常
{
    $transaction->rollBack(); #回滾
}

#########################################################

#預(yù)處理(參數(shù)綁定)  避免注入 提高重復(fù)執(zhí)行的效率
#占位符可以是命名的 (表現(xiàn)為一個唯一的標(biāo)記) 或未命名的 (表現(xiàn)為一個問號)。占位符將被替換為實(shí)際的參數(shù)。
#調(diào)用 CDbCommand::bindParam() 或 CDbCommand::bindValue() 以使用實(shí)際參數(shù)替換這些占位符。 
#這些參數(shù)不需要使用引號引起來:底層的數(shù)據(jù)庫驅(qū)動會為你搞定這個參數(shù)綁定必須在 SQL 語句執(zhí)行之前完成。
##例
#一條帶有兩個占位符 ":username" 和 ":email"的 SQL

$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$command = $connection->createCommand($sql);

#用實(shí)際的用戶名替換占位符 ":username" 
$command->bindParam(":username",$username,PDO::PARAM_STR);

#用實(shí)際的 Email 替換占位符 ":email" 
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();

#重復(fù)執(zhí)行同一個邏輯的時候
#使用新的參數(shù)集插入另一行
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
#bindParam() 和 bindValue() 非常相似。
#唯一的區(qū)別就是前者使用一個 PHP 變量綁定參數(shù), 
#而后者使用一個值。對于那些內(nèi)存中的大數(shù)據(jù)塊參數(shù),處于性能的考慮,應(yīng)優(yōu)先使用前者。
#########################################################
#綁定列
$sql="SELECT username, email FROM tbl_user";
$dataReader=$connection->createCommand($sql)->query();
#使用 $username 變量綁定第一列 (username) 
$dataReader->bindColumn(1,$username);
#使用 $email 變量綁定第二列 (email) 
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
    #$username 和 $email 含有當(dāng)前行中的 username 和 email 
    #這里就不用每次都給兩個變量賦值了
}

使用表前綴:

#########################################################
#使用表前綴
#配置 CDbConnection::tablePrefix 屬性為所希望的表前綴。 
#array(
#    'components'=>array(
#        'db'=>array(
#            'class'=>'CDbConnection',
#            'connectionString'=>'mysql:host=localhost;dbname=testdb',
#            'username'=>'root',
#            'password'=>'password',
#            'emulatePrepare'=>true,  // needed by some MySQL installations
#            'tablePrefix'=>"表前綴_"
#        ),
#    ),
#)
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();

where的用法:

######################

$user = Yii::app()->db->createCommand()
        ->select('username, password')
        ->from('tbl_user')
        ->where('id=:id', array(':id'=>1))
        ->queryRow();



where() 方法 (可用自 v1.1.6)
public CDbCommand where(mixed $conditions, array $params=array ( ))

$conditions    mixed    放在WHERE部分的條件。
$params    array    綁定到此查詢的參數(shù) (name=>value)
{return}    CDbCommand    返回此命令對象本身

設(shè)置查詢的WHERE。 

這個方法要求一個 $conditions 參數(shù)和一個 $params 參數(shù), 指定值綁定到查詢。 

$conditions 參數(shù)可以是一個字符串(例如 'id=1')或一個數(shù)組。 如果是后者,它必須是這種格式 array(operator, operand1, operand2, ...), 操作符可以是下面當(dāng)中的一個,可能的操作數(shù)依賴于相應(yīng)的操作符 :

and: 操作數(shù)應(yīng)該使用AND連接起來。例如, array('and', 'id=1', 'id=2') 將生成 'id=1 AND id=2'。如果一個操作數(shù)是一個數(shù)組, 它將被使用這里描述的相同規(guī)則轉(zhuǎn)換成一個字符串。例如, array('and', 'type=1', array('or', 'id=1', 'id=2')) 將生成 'type=1 AND (id=1 OR id=2)'。 該方法將不做任何引用或轉(zhuǎn)義。
or: 和 and 操作符相似,除了操作數(shù)是使用OR連接起來。
in: 操作數(shù)1應(yīng)該是一列或DB表達(dá)式,操作數(shù)2應(yīng)該是一個數(shù)組, 表示相應(yīng)的列的值或DB表達(dá)式應(yīng)該在的范圍。例如, array('in', 'id', array(1,2,3)) 將生成 'id IN (1,2,3)'. 這個方法將正確的引用列名和范圍中的轉(zhuǎn)義值。
not in: 和 in 相似,除了在生成條件時把IN替換成NOT IN.
like: 操作數(shù)1應(yīng)該是一列或一個DB表達(dá)式,操作數(shù)2是一個字符串或一個數(shù)組 表示列或DB表達(dá)式應(yīng)該like的值。 例如, array('like', 'name', '%tester%') 將生成 "name LIKE '%tester%'". 當(dāng)值范圍被給定為一個數(shù)組,多個LIKE謂語將被生成并使用AND連接起來。 例如, array('like', 'name', array('%test%', '%sample%')) 將生成 "name LIKE '%test%' AND name LIKE '%sample%'". 這個方法將正確的引用列名和范圍中的轉(zhuǎn)義值。
not like: 和 like相似,除了在生成條件時使用NOT LIKE替換LIKE。
or like: 和 like相似,除了OR被用作把LIKE謂語連接起來。
or not like: 和 not like相似,除了OR被用作把NOT LIKE謂語連接起來。

查詢方法一:

$connection = Yii::app()->dboa;
$result = $connection->createCommand()
        ->from('sys_access_log log')
        ->select('log.*,employees.*,departments.*')
        ->leftJoin('syberos_db.syberos_employees employees','log.userid=employees.userid')
        ->leftJoin('syberos_db.syberos_departments departments','employees.deptid = departments.deptid')
        ->where('accessdate=:accessdate' , [ ':accessdate' => $date ])
        ->limit(2)
        ->queryAll();

查詢方法二:

$command = $connection->createCommand();
$command->select($column);
$command->from('sys_access_log log');
$command->leftJoin('syberos_db.syberos_employees employees','log.userid=employees.userid');
$command->leftJoin('syberos_db.syberos_departments departments','employees.deptid = departments.deptid');
$command->where($where);
$command->limit(2);
$result = $command->queryAll();

事務(wù)的使用:

$transaction = $connection->beginTransaction();
try { 
  $connection->createCommand($sql1)->execute();
  $connection->createCommand($sql2)->execute(); // ... executing other SQL statements ... 
  $transaction->commit();
} catch (Exception $e) { 
  $transaction->rollBack();
}

模糊查詢where()的使用

簡單的用法中,where()方法是設(shè)置查詢條件的,也就是sql語句中的where部分,例如:

$query = Article::find()->where(['status'=>10]);
//sql: SELECT * FROM `article` WHERE `status`=10
$query = Article::find()->where(['status'=>10, 'type'=>1]);
//sql: SELECT * FROM `article` WHERE (`status`=10) AND (`type`=1)
$query = Article::find()->where(['status'=>10, 'id'=>[1,2,3]]);
//sql: SELECT * FROM `article` WHERE (`status`=10) AND (`id` IN (1, 2, 3))

where()還可以指定運(yùn)輸符,例如:

$query = Article::find()->where(['>=', 'id', 10]);
//sql: SELECT * FROM `article` WHERE `id` >= 10

當(dāng)然,where()還有更復(fù)雜的用法,例如:

$query = Article::find()->where(['and', 'type=1', 'status=10']);
//sql: SELECT * FROM `article` WHERE (type=1) AND (status=10)
$query = Article::find()->where(['and', 'type=1', ['or', 'cid=1', 'status=10']]);
//sql: SELECT * FROM `article` WHERE (type=1) AND ((cid=1) OR (status=10))

除了and,當(dāng)然還有如or、not、between、not between、in、not in、like、or like、not like、or not like、exists、not exists,用法示例如下:

//or
$query = Article::find()->where(['or', ['type'=>[7,8,9]], ['status'=>[1,2,3]]]);
//sql: SELECT * FROM `article` WHERE (`type` IN (7, 8, 9)) OR (`status` IN (1, 2, 3))

//not
$query = Article::find()->where(['not', ['type'=>[7,8,9]]]);
//sql: SELECT * FROM `article` WHERE NOT (`type` IN (7, 8, 9))

//between
$query = Article::find()->where(['between', 'id', 1, 10]);
//sql: SELECT * FROM `article` WHERE `id` BETWEEN 1 AND 10

//not between
$query = Article::find()->where(['not between', 'id', 1, 10]);
//sql: SELECT * FROM `article` WHERE `id` NOT BETWEEN 1 AND 10

//in
$query = Article::find()->where(['in', 'id', [1,2,3]]);
//sql: SELECT * FROM `article` WHERE `id` IN (1, 2, 3)
$query = Article::find()->where(['in', ['id', 'type'], [['id'=>1, 'type'=>10], ['id'=>2, 'type'=>8]]]);
//sql: SELECT * FROM `article` WHERE (`id`, `type`) IN ((1, 10), (2, 8))

//not in
$query = Article::find()->where(['not in', 'id', [1,2,3]]);
//sql: SELECT * FROM `article` WHERE `id` NOT IN (1, 2, 3)

//like
$query = Article::find()->where(['like', 'name', 'tester']);
//sql: SELECT * FROM `article` WHERE `name` LIKE '%tester%'
$query = Article::find()->where(['like', 'name', ['test', 'sample']]);
//sql: SELECT * FROM `article` WHERE `name` LIKE '%test%' AND `name` LIKE '%sample%'
$query = Article::find()->where(['like', 'name', '%tester', false]);
//sql: SELECT * FROM `article` WHERE `name` LIKE '%tester'

//or like
$query = Article::find()->where(['or like', 'name', ['test', 'sample']]);
//sql: SELECT * FROM `article` WHERE `name` LIKE '%test%' OR `name` LIKE '%sample%'

//not like
$query = Article::find()->where(['not like', 'name', 'tester']);
//sql: SELECT * FROM `article` WHERE `name` NOT LIKE '%tester%'

//or not like
$query = Article::find()->where(['or not like', 'name', ['test', 'sample']]);
//sql: SELECT * FROM `article` WHERE `name` NOT LIKE '%test%' OR `name` NOT LIKE '%sample%'

//exists
$query = Article::find()->where(['exists', Article::find()->select('id')->from('users')->where(['active'=>1])]);
//sql: SELECT * FROM `article` WHERE EXISTS (SELECT `id` FROM `users` WHERE `active`=1)

//not exists
$query = Article::find()->where(['not exists', Article::find()->select('id')->from('users')->where(['active'=>1])]);
//sql: SELECT * FROM `article` WHERE NOT EXISTS (SELECT `id` FROM `users` WHERE `active`=1)

查看SQL輸出日志,使用text屬性關(guān)鍵字:

$oCommand -> select ( 'count(*) as count' );
Yii::log(($oCommand->text));
return $oCommand -> queryRow () ['count'];

https://blog.csdn.net/qq_36373262/article/details/53445954

https://blog.csdn.net/liruxing1715/article/details/42168953

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容