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語句
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 (後續....... )