您的位置:首页 > 编程语言 > PHP开发

Yii框架开发商城(四)

2014-03-31 02:21 218 查看
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 (后续....... )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: