Yii1.1 createCommand 命令

热身训练:

$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. 建立数据库连接 可以使用  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 ;
#访问数据库连接了。它已经被自动激活了,除非我们特意配置了 
#CDbConnection::autoConnect 为 false。
# 通过这种方式,这个单独的DB连接就可以在我们代码中的很多地方共享。
# 如果没有,你可能需要显式建立一个连接:
 $connection=new CDbConnection($dsn,$username,$password);
$connection->active=true;  # 建立链接之后active为true;
$connection->active=false;  # 关闭连接

#运行SQL
$command=$connection->createCommand($sql);
#SQL修改
$command->text = $newSQL;
#########################################################
#execute()方法用来执行 INSERT, UPDATE 和 DELETE 。如果成功,它将返回此执行所影响的行数。
#query() 方法执行一条会返回若干行数据的 SQL 语句,例如 SELECT。
#如果成功,它将返回一个CDbDataReader 实例,通过此实例可以遍历数据的结果行。
#为简便起见, (Yii)还实现了一系列 queryXXX() 方法以直接返回查询结果
#如果SQL发生错误,将会抛出一个异常。.
$rowCount   =    $command->execute();                # 执行无查询 SQL
$dataReader =    $command->query();                  # 执行一个 SQL 查询
$rows       =    $command->queryAll();               # 查询并返回结果中的所有行
$row        =    $command->queryRow();               # 查询并返回结果中的第一行
$column     =    $command->queryColumn();            # 查询并返回结果中的第一列
$value      =    $command->queryScalar();            # 查询并返回结果中第一行的第一个字段
#########################################################

#获取查询结果
#在生成 CDbDataReader后
#重复调用 CDbDataReader::read()
#也可以在 foreach 语言结构中使用 CDbDataReader
####例如####
$dataReader = $command->query();

#方法1 重复调用 read() 直到它返回 false
while( ($row = $dataReader->read()) !== false) { ... }
#方法2 使用 foreach 遍历数据中的每一行
foreach($dataReader as $row) { ... }
#方法3 一次性提取所有行到一个数组
$rows = $dataReader->readAll();

#注意: 
#所有的 queryXXX() 方法会直接返回数据
#query()却不会,返回的是一个CDbDataReader 的实例

#使用事务
$transaction= $connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    #其他
    $transaction->commit();
}
catch(Exception $e) # 如果有一条查询失败,则会抛出异常
{
    $transaction->rollBack(); #回滚
}

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

#预处理(参数绑定)  避免注入 提高重复执行的效率
#占位符可以是命名的 (表现为一个唯一的标记) 或未命名的 (表现为一个问号)。占位符将被替换为实际的参数。
#调用 CDbCommand::bindParam() 或 CDbCommand::bindValue() 以使用实际参数替换这些占位符。 
#这些参数不需要使用引号引起来:底层的数据库驱动会为你搞定这个参数绑定必须在 SQL 语句执行之前完成。
##例
#一条带有两个占位符 ":username" 和 ":email"的 SQL

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

#用实际的用户名替换占位符 ":username" 
$command->bindParam(":username",$username,PDO::PARAM_STR);

#用实际的 Email 替换占位符 ":email" 
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();

#重复执行同一个逻辑的时候
#使用新的参数集插入另一行
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
#bindParam() 和 bindValue() 非常相似。
#唯一的区别就是前者使用一个 PHP 变量绑定参数, 
#而后者使用一个值。对于那些内存中的大数据块参数,处于性能的考虑,应优先使用前者。
#########################################################
#绑定列
$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 含有当前行中的 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    绑定到此查询的参数 (name=>value)
{return}    CDbCommand    返回此命令对象本身

设置查询的WHERE。 

这个方法要求一个 $conditions 参数和一个 $params 参数, 指定值绑定到查询。 

$conditions 参数可以是一个字符串(例如 'id=1')或一个数组。 如果是后者,它必须是这种格式 array(operator, operand1, operand2, ...), 操作符可以是下面当中的一个,可能的操作数依赖于相应的操作符 :

and: 操作数应该使用AND连接起来。例如, array('and', 'id=1', 'id=2') 将生成 'id=1 AND id=2'。如果一个操作数是一个数组, 它将被使用这里描述的相同规则转换成一个字符串。例如, array('and', 'type=1', array('or', 'id=1', 'id=2')) 将生成 'type=1 AND (id=1 OR id=2)'。 该方法将不做任何引用或转义。
or: 和 and 操作符相似,除了操作数是使用OR连接起来。
in: 操作数1应该是一列或DB表达式,操作数2应该是一个数组, 表示相应的列的值或DB表达式应该在的范围。例如, array('in', 'id', array(1,2,3)) 将生成 'id IN (1,2,3)'. 这个方法将正确的引用列名和范围中的转义值。
not in: 和 in 相似,除了在生成条件时把IN替换成NOT IN.
like: 操作数1应该是一列或一个DB表达式,操作数2是一个字符串或一个数组 表示列或DB表达式应该like的值。 例如, array('like', 'name', '%tester%') 将生成 "name LIKE '%tester%'". 当值范围被给定为一个数组,多个LIKE谓语将被生成并使用AND连接起来。 例如, array('like', 'name', array('%test%', '%sample%')) 将生成 "name LIKE '%test%' AND name LIKE '%sample%'". 这个方法将正确的引用列名和范围中的转义值。
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();

事务的使用:

$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()方法是设置查询条件的,也就是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()还可以指定运输符,例如:

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

当然,where()还有更复杂的用法,例如:

$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,当然还有如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属性关键字:

$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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容