1. 程式人生 > >YII2框架學習 基礎篇(二) YII2資料庫操作

YII2框架學習 基礎篇(二) YII2資料庫操作

實際專案中PHP肯定離不開資料庫,YII框架有很多針對資料庫的操作,學習一下。學習YII框架資料庫指令的同時,也可以學到YII框架的資料模型,一石二鳥啊。另外,昨天釋出了第一篇後,發現有幾十個人看了我的http://blog.csdn.net/m0_37645820/article/details/72855543,YII2框架學習 基礎篇(一)。自己看了看,排版太差了,以後好好寫。
1.xmapp建資料庫
因為是用的xampp建站,這次用的資料庫是**mysql**,先在xampp把mysql開啟。開啟後進到http://localhost/phpmyadmin/,就可以看見資料庫了。在mysql新建庫名為yii,新建表名為test,表頭為id和name,然後隨便輸入點資料就行了,準備工作完畢。
2.修改yii資料庫配置
然後需要修改一下config資料夾下db.php檔案裡面的dsn值為'dsn' => 'mysql:host=localhost;dbname=yii'。這樣yii框架就可以使用剛剛建好的資料庫了
3.編寫資料模型

在models下新建php檔名為Test,新建\yii\db\ActiveRecord子類Test。

namespace app\models;
use yii\db\ActiveRecord;
class Test extends \yii\db\ActiveRecord{

}
這樣資料模型就建好了。接下來可以在控制器裡面呼叫。
4.控制器呼叫資料庫操作。
其實yii框架呼叫資料庫操作的過程可以用一句話來說明,就是把資料從表裡面拿出來放到物件裡面,通過物件的方法來達到對資料庫的操作。 
先說說查詢,等下再說增刪改。比如我要查詢資料庫裡面id在1和9之間的資料,就可以呼叫剛剛建的Test類的find方法,查詢
Test::find()->where(['between','id',1,9])->asArray()->all();
注意,此處的asArray作用是把取出來的物件轉化成陣列,這麼做是為了節省記憶體。同時,還有一種辦法可以節省記憶體,因為之前說過了,把資料從表裡面拿出來放到物件裡面,

通過物件的方法來達到對資料庫的操作。asArray把結果變成陣列,就無法操作了,此時可以通過php中最常用的foreach達到效果。

此外,yii還提供很多查詢方式,比如like之類的,有興趣的可以上www.yiichina.com裡面有中文文件,很有用。下面列舉一些我練手的時候寫的程式碼

//$sql = 'select * from test where id=:id';
        //$res = Test::findBySql($sql,array(':id'=>''))->all();
       /* $res = Test::find()->where(['id'=>8])->all();*/
       /* $res = Test::find()->where(['>','id',7])->all();*/
        /*$res = Test::find()->where(['between','id',7,9])->all();*/
        /*        $res = Test::find()->where(['like','title','e'])->all();*/
        //$res = Test::find()->where(['between','id',1,9])->asArray()->all();
接下講增,先新建Test物件,寫入id和name屬性,然後呼叫save方法。就可以了。
        $test = new Test;
        $test->id ='4';
        $test->title = 'baa';
        $test->save();

然而,在實際使用中,使用者可能輸入超出長度之類的違法輸入,這個時候,前面建的資料模型就真正派上用場了。在model下的test.php,Test類裡面加入rules方法
public function  rules(){
        return[
            ['id','integer'],
            ['title','string','length'=>[0,5]]
        ];
}
同時,剛剛在控制器寫入的程式碼也要修改
$test = new Test;
        $test->id ='4';
        $test->title = 'baa';
        $test->validate();
        if($test->hasErrors()){
            echo 'error';
            die;
        }
        $test->save();
這樣我們就可以對輸入進行驗證了,是不是很方便。

改的話,和增類似,不過是把新建物件變成查詢。也可以加輸入驗證。
$res = Test::find()->where(['id'=>4])->one();
        $res->title = 'qwqq';
        $res->save();
刪太簡單了,就順便講個yii很實用的功能。為了防止使用者在輸入搞鬼,自加條件,如輸入id為0||0=0查詢;那麼肯定是會全部通過的,全部資料庫就暴露了。這種時候,

可以用yii的技巧。比如刪除id>0的資料,可以這麼寫

Test::deleteAll('id>:id',array(':id'=>'0'));

最後講一個高階點的東西,關聯查詢,就是兩個表關聯查詢。比如我有一個顧客列表customer,訂單列表orders。就可以通過關聯查詢得知顧客列表中的顧客在訂單列表中的訂單。現在資料庫中建這兩個表。customer有id,name項。orders有id,c_id(對應顧客id)和price項。

$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
        $orders = $customer->hasMany('app\models\Order',['c_id'=>'id'])->asArray()->all();
        $orders = $customer->getOrders();
        $orders = $customer->orders;//訪問一個不存在的屬性時,
        print_r($orders);

其中 $customer->hasMany('app\models\Order',['c_id'=>'id'])->asArray()->all();可以放到資料模型。就不寫了。
終於把基礎的基礎講完了。預告,下週學習高效篇。