1.Yii如何使用數據庫
Yii通過數據庫訪問對象(Database Access Objects,簡稱DAO)來使用數據庫的。
DAO建立在“PHP數據對象(PDO)之上,並提供一套面向對象的API來訪問數據庫”
2.數據庫的連接
數據庫的連接通常放在配置文件中,/common/config/main-local.php中。
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
],
這里表示會創建一個yii\db\Connection對象,並用這個對象訪問數據庫。
這個數據庫連接對象的寫法:Yii->$app->db
連接不同數據庫的語句略微有些差異。
3,數據庫查詢(yii\db\Command)
用SQL查詢語句來創建一個yii\db\Command的對象,調用對象的方法來執行SQL查詢,返回值是字符型的數組。
$post = Yii::$app->db->createCommand('SELECT * FROM post')->queryAll();
SQL語句還可以綁定參數。
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id',$_GET['id'])
->bindValue(':status',2)
->queryOne();
4,yii\db\Command的優缺點
1,簡單,只需要處理sql語句和數組就行了(優點)
2,高效,通過sql語句來查詢數據庫非常高效。(優點)
----------------------------------------------------------
1,不同的數據庫系統的sql語句會有些差別,因此無法做到代碼適用於多種數據庫系統。(缺點)
2,用數組,而沒有用到面向對象的方式來管理數據,代碼難維護。(缺點)
3,如果不小心,會留下SQL注入這種不安全因素。(缺點)
5,ActiveRecord
(1)
ActiveRecord(活動記錄,簡稱AR類)提供了一項面向對象的接口,可以訪問數據庫中的數據。
一個AR類關聯一張數據表,每個AR對象對應表中的一行
AR對象的屬性,對應數據庫的列
可以直接以面向對象的方式來操縱數據庫中的數據(AR把數據庫和模型建立的聯系),這樣就不需要寫SQL語句就能實現數據庫的訪問了。
(2)聲明ActiveRecord類
通過繼承yii\db\ActiveRecord基類來聲明一個AR類,並實現tableName方法,返回與之相關聯的數據表的名稱
class Post extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'post';
}
AR提供了兩種方法來構建DB查詢,返回AR對象。
yii\db\ActiveRecord::find()
$model = Post::find()->where(['id' => 1])->one();
$model = Post::find()->where([status" => 1])->all();
這兩個方法的簡便替換方法是:
$model = Post::findOne(1)
$models = Post::findAll(['status' => 1])
(3)更為復雜的查詢就得求助於類參考手冊了。通過查詢,得到復雜的查詢需要借助ActiveQueryInterface這個接口。
ActiveQueryInterface的常用方法:
舉例說明:
$post = Post::find()->where(['AND',['status' => 2],['author_id => 1'],['like',"title",'yii2']])->orderBy('id')->all();
此外可以通過 yii\db\ActiveRecord::findBySql()來進行數據查詢,不常用。
$sql = 'SELECT * FROM post where status=1';
$posts = Post::findBySql($sql)->all();
(4)訪問列數據
AR對象的屬性,對應為數據行的列
$model = Post::findOne(1);
echo $model->id;
echo $model->title;
------------------------
$model = Post::findAll(['status' => 1]);
foreach($model as $item)
{
echo $item->id;
echo $item->title;
}
(5)操作數據CRUD
AR提供下邊這些方法來實現插入,更新和刪除等功能
yii\db\ActiveRecord::insert()
yii\db\ActiveRecord::update()
yii\db\ActiveRecord::delete()
yii\db\ActiveRecord::save()
(6)AR查詢關聯數據
ActiveRecord類通過hasOne或者hasMany方法來建立兩張表的關聯關系。
hasOne用於多對一,一對一的情況;hasMany用於一對多的情況
建立關聯關系后,就可以像訪問自己的類數據一樣便捷地去訪問關聯表數據。
Gii會根據數據庫表之間的關聯關系,自動生成建立類之間關聯關系的代碼。
例如:
$thePost->status0->name
$thePost->comments
-----------------------------------------
public function getStatus0()
{
return $this->hasOne(Poststatus::className(),['id' => 'status']);
}
-------------------------------------------------
public function getComments()
{
return $this->hasMany(Comment::className(),['post_id' => 'id'])
}
6,查詢構建器QueryBuilder
1,什么是查詢構建器
查詢構建器也是建立在DAO基礎之上的,可讓你創建程序化的,DBMS無關的SQL語句,並且,這樣創建的SQL語句,比原生的SQL語句更加易讀。更安全。
2,使用查詢構建器的步驟
(1)構建查詢:創建一個yii\db\Query對象來代表一條SELECT SQL語句,然后通過調用一套可以串起來的方法,比如select方法,from方法,where方法等這些方法,構建出可以滿足一定要求的查詢條件。
(2)執行查詢。執行yii\db\Query的一個查詢方法從數據庫當中檢索數據。例如:all(),one(),column()等這些查詢方法。
$allStatus = (new \yii\db\Query())
->select(['name','id'])
->from('poststatus')
->indexBy('id')
->column();
總結: