第五章:CRUD的操作(YII)

创建一个用来测试的表:
CREATE TABLE tbl_project
(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(128),
description TEXT,
create_time DATETIME,
create_user_id INTEGER,
update_time DATETIME,
update_user_id INTEGER
);


表名命名规则
在我们的开发中,我们将所有表名和列名都使用小写字母。
Yii中为了采用表前缀支持,必须设置CDbConnection::tablePrefix属性为期望的表前缀。然后在整个应用程序的SQL语句中,可以使用{{TableName}} 做为参考表名,其中TableName就是表的名称,但不用前缀。

配置Gii
从1.1.2版本起,Yii有一个新的和更复杂的界面工具Gii。Gii是一个高度可定制和可扩展的基础于Web的代码生成平台,把yiic shell命令提升到了新的高度。我们将使用这个新平台,创建我们的新模型类。
打开配置文件:proctected/config/main.php,然后找到modules,输入以下code:
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),

通过如下命令访问,密码就是你配置的密码:http://127.0.0.1/yiidemo/index.php?r=gii/default/login

使用Gii创建项目(project)AR类
在进入gii页面,可以看到所有的选项与使用$ yiic shell命令行帮助显示出来的是一样的,现在我们需要创建一个Model。

如果您使用一个前缀tbl,你可以在此添加。指定此值将意味着我们新生成的AR类将被命名为Project,而不是tbl_project。
接下来的两个字段域是要求输入表名和我们希望生成的类名。我们表的名称是tbl_project。模型类它使用表名但没有前缀,并以大写字母开头来。因此,Project为我们模型类的名称。
Base Class字段用来指定继承哪个模型类。这个类是CActiveRecord或它的子类。
Model Path字段类允许你指定这个模型类文件在应用程序中的位置。
Code Template字段指定使用的生成器的模板。我们可以自定义默认模板以应对其它可能出现的情况,比如所有的模型需要有共同的需求。

Gii已经为我们创建了一个新的AR模型类。它的名字是Project.php,默认情况下,放在protected/models/目录。这个类封装了是我们的tbl_project 表。表中的所有字段访问是通过Project AR类的属性。


创建单元测试文件
首先,需要创建一个新的单元测试文件,让我们创建这个文件在:protected/tests/unit/ProjectTest.php,并输入如下代码:
<?php
class ProjectTestextends CDbTestCase
{
public function testCRUD()
{

}
}
这个类继承自CDbTestCase,这是Yii框架中单测元类的基类,最门用来测试与数据库相关的功能。这个特定的基类提供了一些管理操作。下面我们将介绍更多的细节。

插入(Create)
function testCURD()
{
   //Create a new project
   $newProject=new Project;
   $newProjectName = 'Test Project 1';
   $newProject->setAttributes(
   array(
'name' => $newProjectName,
'description' => 'Test project number one',
'create_time' => '2010-01-01 00:00:00',
'create_user_id' => 1,
'update_time' => '2010-01-01 00:00:00',
'update_user_id' => 1,
)
     );
     $this->assertTrue($newProject->save(false));
}
我们传递给save()方法一个参数false,用来告诉它绕过属性的数据验证(我们将在数据模型验证部份介绍它,添加自己的验证字段)。然后我们测试返回值,保存成功将返回true。


读取(Read)
使用phpunit进行检测,首先我们插入一个数据,然后通过返回的id得到所有刚刚插入的数据,最后判断我们插入的名字和得到的名字是不是相同的。
function testCURD()
{
   //Create a new project
   $newProject=new Project;
   $newProjectName = 'Test Project 2';
   $newProject->setAttributes(
array(
'name' => $newProjectName,
'description' => 'Test project number one',
'create_time' => '2010-01-01 00:00:00',
'create_user_id' => 1,
'update_time' => '2010-01-01 00:00:00',
'update_user_id' => 1,
)
   );
    $this->assertTrue($newProject->save(false));

     //Read the insert data
$projectModel = Project::model()->findByPk($newProject->id);
$this->assertTrue($projectModel instanceof Project);
$this->assertEquals($newProjectName,$projectModel->name);

}
在这里,我们使用静态方法model(),它已经定义在了每一个AR类中。这个方法返回了Project AR类的实例,从而进行内部访问该类的方法。

测试更新(Update)和删除(Delete)
function testCURD()
{
 //Create a new project
 ...

      //Read the insert data
      ...

//UPDATE the newly created project
$updatedProjectName = 'Updated Test Project 1';
$newProject->name = $updatedProjectName;
$this->assertTrue($newProject->save(false));

//read back the record again to ensure the update worked
$updatedProject=Project::model()->findByPk($newProject->id);
$this->assertTrue($updatedProject instanceof Project);
$this->assertEquals($updatedProjectName,$updatedProject->name);

//DELETE the project
$newProjectId = $newProject->id;
$this->assertTrue($newProject->delete());
$deletedProject=Project::model()->findByPk($newProjectId);
$this->assertEquals(NULL,$deletedProject);
}

在这里,我们增加了用来测试项目(project) 的更新和删除的代码。首先,我们给$newProject实例更新name属性。由于这里的AR实例已经存在,我们知道这个,AR类是更新,而不是插入新记录,当我们调用->save()后,我们再读回这行,来确定是否更新
了name。
为了测试删除,我们保存$newProject实例的id 属性值到一个局部变量$newProjectId。然后,我们调用$newProject实例的->delete() 方法。然后我们尝试通过这个$newProjectId作为主键,查询Project返回这行。由于这条记录已经被删除,我们将得到的结果为NULL。测试断言将使用NULL比较。

通过脚手架为项目创建 CRUD
进入gii并选中Crud Generator。我们看到两个表单字段域。第一个是要求我们指定模型类,我们希望生成所有的 CRUD 操作。在我们的例子中,使用 Project.php 这个 AR 类。所以在这个字段域中填写 Project。当我 们输入后,我们注意到,Controller ID 字段域自动填充成了 project,这是基于 Yii 的约定。我们 现在保持默认即可。

我们可以看到将要生成很多的文件,其实包括一个 ProjectContrller.php 控制器类文件(它的包 括了 CRUD 的所有操作方法)和许多的视图文件,每一个单独的视图文件对应每一个操作同时 提供了可以搜索项目 (project) 记录。你当然也可以通过去掉复选框的选择来不生成一些相应文 件。然后,对我们而言,我们很喜欢 Gii 为我们创建的这些文件。 


为表单添加必填字段域
在YII中表单与AR模型交互时,我们可以设置一个验证规则来限制字段域的范围。我们在Project AR模型类的rules()方法中,添加一个数组,数组包含特定的值。

打开/protected/models/Project.php 类,已经看到了公共的 rules 方法被定义了,并且在 rules方法中已经存在了一些规则。
rules() 方法返回的是一个规则数组,一般每一个规则格式如下所示:
Array('Attribute List', 'Validator', 'on'=>'Scenario List',additional options) 相关属性解释如下:
Attribute List(属性列表) 是一个字符串,需要验证的类的属性名用逗号分开。
Validator(验证器) 指的是使用什么样的规则执行验证。
on 这个参数指定了一个 scenario(情景) 列表来使用这条验证规则。
注:scenario(情景) 允许你限制验证规则应用在特定的上下文中。一种典型的例子 是 insert(插入) 或 update(更新)。例如:如果被指定为 ‘on’=>’insert’,这将表 明验证规则只适用于模型的插入情景。这同样适用于’update’ 或其它的任何你 希望定义的情景。你可以设置一个模型的 scenario(情景) 属性或通过构造函数传给一个模型的实例。
additional options(附加选项) 是 name/value(键值对) 出现的,用来初始化 validator(验证器) 的属性。

validator(验证器) 可以是模型类中的一个方法或一个单独的验证器类。如果定义为模型类中的方 法,它的格式必须是如下的形式:
public function ValidatorName($attribute,$params) { … }

如果我们使用一个 validator(验证器) 类,则这个类必须继承 CValidator。其实有三种方法可以指 定validator(验证器),包括前面提到的一种格式:
1. 第一种是在模型类中定义验证方法
2. 第二种是指定一个单独的验证器类(这个类继承 CValidator)。
3. 第三种是你可以使用 Yii 框架中现有的验证器,指定预定义的验证器别名即可。

Yii 为你提供了很多预定义的验证器类,同时也指定了别名,用在定义规则时。Yii1.1 版本,预定义的验证器别名的完整列表如下:
• boolean:它是 CBooleanValidator 类的别名,验证属性的值是布尔值 (true 或 false)。
• captcha:它是 CCaptchaValidator 类的别名,验证属性的值等于一个显示的CAPTCHA(验
证码) 的值。
• compare:它是 CCompareValidator 类的别名,验证属性的值与另一个属性的值相等。
• email:它是 CEmailValidator 类的别名,验证属性的值为有一个有效的 Email 地址。
• default:它是 CDefaultValidator 类的别名,验证属性的值为分配的默认值。
• exist:它是 CExistValidator 类的别名,验证属性的值在表中的对应列中存在。
• file:它是 CFileValidator 类的别名,验证属性的值包含上传的文件。
• filter:它是 CFilterValidator 类的别名,用过滤器转换属性的值。
• in:它是 CRangeValidator 类的别名,验证属性值在一个预定义列表中。
• length:它是 CStringValidator 类的别名,验证属性值的长度在一个范围内。
• match:它是 CRegularExpressionValidator 类的别名,验证属性值匹配一个正则表达式。
• numerical:它是 CNumberValidator 类的别名,验证属性值是数字。
• required:它是 CRequiredValidator 类的别名,验证属性值必需有值,不能为空。
• type:它是 CTypedValidator 类的别名,验证属性值是一个指定的数据类型。
• unique:它是 CUniquedValidator 类的别名,验证属性值在表中的对应列中是唯一的。
• url:它是 CUrlValidator 类的别名,验证属性值是一个有效的 URL。

所以知道了上面的信息后,如果我想增加一个新的验证规则,名字必填的话,可以这样在rules里写:
return array(
     …
     //array('name', 'required'), 
     //name 和 description都必填
     array('name, description', 'required'),
     …
);






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值