Yii如何使用數據庫


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();

 

總結:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM