yii列印sql
① yii2怎麼連接sql server
在saas中,多租戶資料庫分庫管理時常常需要自定義資料庫鏈接,並且需要支持在框架載入後再調用資料庫連接。
Yii2 如何定義資料庫連接要注意的是:
即除了使用/Yii::app−>set()外,還需要再多使用下面一句話:/Yii::app->$database->open();
因為在框架載入後再調用時,yii本身並不會幫打開連接。使用如下代碼:
php"><?php/***User:chenlb*/namespacebackend/moles/monitorMysql/controllers/show;classAllDatabasesextends/yii/base/Action{privatestatic$_conn=[];publicfunctionrun(){//CreateTestDBConnection$db=$this->getDb('資料庫名稱');var_mp($db->getSchema()->getTableSchema('log')->columns['id']->isPrimaryKey);exit;}/***得到資料庫連接*/publicfunctiongetDb($database){if(!isset(self::$_conn[$database])){$connInfo=['class'=>'yii/db/Connection','dsn'=>'mysql:host=HOST_IP;port=3307;dbname='.$database,'username'=>'username','password'=>'password','charset'=>'utf8'];/Yii::$app->set($database,$connInfo);/Yii::$app->$database->open();self::$_conn[$database]=/Yii::$app->$database;}returnself::$_conn[$database];}}
② yii能直接輸出sql語句嗎
yii何輸出具體的查詢的sql語句:
java">$query=User::find()->where(['id'=>[1,2,3,4])->select(['username'])
//輸出SQL語句
$commandQuery=clone$query;
echo$commandQuery->createCommand()->getRawSql();$users=$query->all();
③ yii2 怎麼執行原生態的insert
$connection = Yii::app()->db; //連接
//查找
$sql = 「SELECT * FROM `tbl_user` ORDER BY id DESC」;
$command = $connection->createCommand($sql);
$result = $command->queryAll();
print_r($result);
//添加
$sql = 」 INSERT INTO `tbl_user` (`username`, `password`, `email`) VALUES (『test』, 『test』, 『[email protected]』) 「;
$command=$connection->createCommand($sql);
print_r($command->execute());
//添加 返回自增id
$command1 = $connection->createCommand(「SELECT last_insert_id()」);
$result = $command1->queryAll();
//常用函數
(1)如果你執行的SQL語句有返回結果集: 例如SELECT。通常用query開頭的系列函數:
$dataReader=$command->query(); // 執行一個 SQL 查詢
$rows=$command->queryAll(); // 查詢並返回結果中的所有行
$row=$command->queryRow(); // 查詢並返回結果中的第一行
$column=$command->queryColumn(); // 查詢並返回結果中的第一列
$value=$command->queryScalar(); // 查詢並返回結果中第一行的第一個字
(2)你執行的SQL語句返回的不是結果集,只是狀態值,例如:INSERT ,UPDATE,DELETE.則用execute()
$this->command->execute();
//使用事務的一種常見情形:CDbTransaction
$transaction = $connection->beginTransaction();
try{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
………
$transaction->commit();
}
catch(Exception $e){ // 如果有一條查詢失敗,則會拋出異常
$transaction->rollBack();
}
④ yii2.0獲取到最後一條執行的sql怎麼看
這個有很多種方法
1. yii有提供一個getRawSql方法 比如說一個查詢
$query=User::find();
$query->select(['username','age'])->where(['id'=>1)->one();
echo$query->createCommand()->getRawSql();//輸出sql語句
2.可開啟yii2的debug模塊,這個功能很強大,在裡面可以查到當前頁面所有的sql信息,具體配置方法自行網路,網上太多這個配置了
3.查找Yii源碼 隨便找個模型調用原生的方法 比如 User::updateAll 方法,通過編輯器定位到updateAll方法的源碼 你會發現下面一段代碼
publicstaticfunctionupdateAll($attributes,$condition='',$params=[])
{
$command=static::getDb()->createCommand();
$command->update(static::tableName(),$attributes,$condition,$params);
return$command->execute();
}
繼續定位execute方法
publicfunctionexecute()
{
$sql=$this->getSql();
$rawSql=$this->getRawSql();
Yii::info($rawSql,__METHOD__);
if($sql==''){
return0;
}
$this->prepare(false);
$token=$rawSql;
try{
Yii::beginProfile($token,__METHOD__);
$this->pdoStatement->execute();
$n=$this->pdoStatement->rowCount();
Yii::endProfile($token,__METHOD__);
$this->refreshTableSchema();
return$n;
}catch(Exception$e){
Yii::endProfile($token,__METHOD__);
throw$this->db->getSchema()->convertException($e,$rawSql);
}
}
方法里$rawSql就是最原生要執行的sql拉,在這里打斷點輸出就ok
個人推薦第二種方法,最方法最高效,具體配置方法自己網路,很簡單!