Yii框架開發商城(四)

 

 Yii 框架下的數據庫操作....

 MVC 框架  [ Medol   View    Controller]


 建立數據庫,數據表,寫測試數據....... Yii 框架下操作數據庫注意要打開php對PDO的擴展...因爲Yii操作數據庫底層就使用的是PDO

 一、在主配置文件 main.php 中配置數據庫連接



ok,連接上數據庫,我建個名字是 yiishop 的數據庫,在數據庫中建一個 sw_goods 商品表




新建商品數據表,sw_goods

mysql> use yiishop;
Database changed
mysql> DROP TABLE IF EXISTS `sw_goods`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE `sw_goods` (
    ->   `goods_id` int(11) NOT NULL auto_increment COMMENT '自增id',
    ->   `goods_name` varchar(128) collate utf8_unicode_ci NOT NULL COMMENT '名字',
    ->   `goods_weight` int(11) NOT NULL COMMENT '重量',
    ->   `goods_price` float NOT NULL COMMENT '價格',
    ->   `goods_number` int(11) NOT NULL COMMENT '商品庫存數量',
    ->   `goods_category_id` int(11) NOT NULL COMMENT '商品分類',
    ->   `goods_brand_id` int(11) NOT NULL COMMENT '商品品牌',
    ->   `goods_introduce` text collate utf8_unicode_ci NOT NULL COMMENT '介紹',
    ->   `goods_big_img` varchar(128) collate utf8_unicode_ci NOT NULL COMMENT '圖片',
    ->   `goods_small_img` varchar(128) collate utf8_unicode_ci NOT NULL COMMENT '縮略圖',
    ->   `goods_mark` int(11) NOT NULL COMMENT '標誌',
    ->   `goods_create_time` datetime NOT NULL COMMENT '上線時間',
    ->   PRIMARY KEY  (`goods_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='商品表';
Query OK, 0 rows affected (0.36 sec)

 測試下Yii框架是否能連接上數據庫.....

 在控制器裏隨便一個地方輸出信息  var_dump(Yii::app()->db);   括號內的意思是獲得數據庫組件,Yii::app()   這個可以理解爲實例化了一個類的對象...

 我寫在 UserController.php 中的actionLogin() 方法中...訪問一下, 看到 object(CDb Connection) ...... 說明連接成功




二、操作數據庫(CRUD)

   重點......

   在MVC的設計模式中,操作數據庫應該在model層,所以在model沒創建之前,不要去操作數據庫,操作數據庫的動作應在寫在model中......

   有多少數據表,就創建多少模型,對數據庫進行操作,需要實例化模型類,產生對象,通過對象調用對應的方法實現操作數據庫

   每一個model 就是一個類文件,每一個model對應一個數據表,--- 建立一個model,名字是goods [對應 sw_goods 數據表]

   model 中有很多屬性,每一個屬性對應數據表裏面的字段.....[謹記嚴格遵守這種開發設計模式,養成好的習慣]

   model 模型創建出來的一個對象就是數據表中的一條記錄


1. 在 /shop/protected/models/ 目錄下創建 Goods.php    繼承固定的父類  CActiveRecord      

    模型裏面有兩個方法,缺一不可....    model() 靜態方法可以創建一個模型的對象   tableName()方法 返回當前數據表的名稱....

<?php
  2 
  3 /**
  4  *商品模型
  5  *@since 2014-03-30
  6  *@auther jwz
  7  */
  8 class Goods extends CActiveRecord{
  9 
 10   //返回一個模型對象,是必不可少的一個方法
 11   public static function model($className = __CLASS__){
 12  
 13     return parent::model($className);
 14   }
 15  
 16   //返回當數據表的名字,也是一個必不可少的方法
 17   public function tableName(){
 18   
 19     //return 'sw_goods';
 20     return '{{goods}}';
 21   }
 22 }
 23 
 24 ?>

   return ‘{{goods}}’;   這種寫法是爲了防止以後有需求要改動數據表名稱前綴,避免大量的重複操作,採用設置數據表前綴關聯的方法

   在主配置文件 main.php 中設置數據表的前綴 ....   在 ‘db’ 下添加前綴配置


問題:db實際是從哪來?

     首先...在 Yii核心目錄 framework 下 Web/目錄下的 CWebApplication.php  文件中搜索 db.... 木有發現.....

     接着...在Yii 核心目錄framework 下 base 目錄下的 CApplication.php 文件中搜索db ...... ok, 找到了....

'db'=>array(
     'class'=>'CDbConnection',
),
    這裏定義了一個類名... CDbConnection

    然後再 Yii核心目錄 framework 下的 YiiBase.php 文件中搜索  CDbConnection      ...ok.找到下面語句

  

'CDbConnection' =>'/db/CDbConnection.php',
    OK..找到了db從哪來的了......或者可以從framework/yiilite.php 文件中搜索查找,這個文件整合了Yii框架所有的核心代碼,共10000多行

 打開/framework/db/下的 CDbConnection.php 文件,看到有很多屬性,這些屬性正是在 主配置文件 main.php 中的 ‘db’ 下可以配置的字段

  找到前綴屬性 tablePrefix , 並在main.php 中配置數據表前綴    ‘tablePrefix’=> 'sw_',

2.在後臺實現商品信息的查詢

  後臺會自動調用前臺的model,公用一個model,代碼複用性.....所以在後臺的GoodsController.php中的actionShow()方法中直接通過類名調用 Goods::model();

  $goods_model = Goods::model();


解釋:model固定繼承了 CActiveRecord 類

     CActiveRecord  是活躍記錄,AR,在很多成熟的框架裏面都有這個技術. 將數據表的相關內容以 ‘類’ 的形式呈現出來....


  CActiveRecord中有很多方法可以操作數據庫......各種find

  $goods_info = $goods_model->find();           打印 var_dump($goods_info);    使用find()方法每次查詢只查詢一條語句

  $goods_info 得到的是數據表中的一條記錄對應的model對象,要想獲得具體的字段值可以用 $goods_info->‘屬性’ 即可...

  findAll() 方法獲得的是一個數組,數組裏面是數據表裏所有的記錄對應的model對象信息

  在主配置文件 main.php 中打開 Log配置信息,可以顯示程序的運行日誌和具體的sql語句



3.數據信息展示到視圖模板中....

   renderPartial('視圖名字', '傳遞的變量信息');

   在GoodsController中的actionShow方法中, $this->renderPartial('show', $goods_info); 將商品信息傳遞到視圖模板裏面

   在視圖模板中刪除假數據,遍歷獲得的信息,展示

 48           <?php
 49             //遍歷從GoodsController傳遞過來的數據
 50             foreach($goods_info as $good){
 51           ?>
 52                     <tr id="product1">
 53                         <td><?php echo $good->goods_id;?></td>
 54                         <td><a href="#"><?php echo $good->goods_name;?></a></td>
 55                         <td><?php echo $good->goods_number;?></td>
 56                         <td><?php echo $good->goods_price;?></td>
 57                         <td><img src="<?php echo $good->goods_big_img;?>" height="60" width="60"></td>
 58                         <td><img src="<?php echo $good->goods_small_img;?>" height="40" width="40"></td>
 59                         <td><?php echo $good->goods_brand_id;?></td>
 60                         <td><?php echo $good->goods_create_time;?></td>
 61                         <td><a href="#">修改</a></td>
 62                         <td><a href="javascript:;" onclick="delete_product(1)">刪除</a></td>
 63                     </tr>
 64 
 65           <?php
 66             }
 67           ?>

ok,搞定了

4.通過model模型實現數據添加

  在控制器實例化模型對象,對其初始化數據,通過save()方法,可以添加信息到數據庫中

  注意:普通情況下,日誌信息看到的sql添加語句並不會顯示具體的值,都是用參數代替,這是預編譯的效果,如果想在日誌信息中看到sql語句中具體的值

     可在主配置文件 main.php 下配置db           ‘enableParamLogging’ => ‘true’    ok,這樣就可以了


 主要還是寫一下Yii框架下怎麼從頁面表單添加數據到數據庫

 利用助手進行表單展現....       【助手:利用php程序生成html代碼,Yii中的小物件,widget】

 <?php $form = $this->beginWidget('CActiveForm'); ?>       替換html中的 form 開始標籤

 <?php $this->endWidget(); ?>       替換 html 中的 form 結束標籤


 <?php echo $form->labelEx($goods_model,'goods_name')?>    替換label標籤

 <?php echo $form->textField($goods_model,'goods_name'); ?>    替換 html 中的 input 標籤

注:所有的替換表單域段都在  Web/widget/CActiveForm.php 文件中能找到對應的方法     這裏的$this 代表控制器,$form爲獲取到的小物件, $goods_model 是對應的模型實例


ok,創建完後校驗一下....

 刷新訪問一下,查看網頁源代碼,會看到生成的表單代碼......

<td><label for="Goods_goods_name">Goods Name</label></td>
<td>
 <input name="Goods[goods_name]" id="Goods_goods_name" type="text" /> 
</td>

這就是用小物件生成的錶帶

ok  (後續....... )


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章