一步一步学Yii开发(二)
我们接上篇的
继续我们的Yii开发学习。
首先我们来配置数据库的连接。
8. 配置Yii的数据库连接
打开/config/main.php,这个Yii的配置文件。找到下面的部分:
'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
// uncomment the following to use a MySQL database
/*'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=test',
'emulatePrepare' => true,
'username' => 'admin',
'password' => 'admin',
'charset' => 'utf8',
),*/
Yii默认使用的是sqlite,假设我们要使用mysql,那么改为:
/* 'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),*/
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=test',
'emulatePrepare' => true,
'username' => 'admin',
'password' => 'admin',
'charset' => 'utf8',
),
把上面的红色的部分改成你的数据库的名字,用户名和密码。
9. 创建数据表
在命令行中使用
mysql -u 用户名 -p
登录进mysql系统。
然后使用下面的命令创建我们的数据表,
CREATE TABLE tbl_test ( id INT NOT NULL AUTO_INCREMENT, name varchar(32), PRIMARY KEY(id) );
这样就创建了只有2列的一个表,id和名字,id为主键。接着我们插入2条数据:
INSERT INTO tbl_test( name ) VALUES('lucy');
INSERT INTO tbl_test( name ) VALUES('joan');
10. 创建model
去到models这个目录,创建一个Test.php,然后输入如下内容:
<?php class Test extends CActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'tbl_test'; } public function rules() { } } ?>
对上面的代码稍作解释,第一个函数是一个静态函数,其实就是返回一个该类的对象的。关于这个这个东西完全可以放在父类CActiveRecord中,不知道为什么Yii要求放在子类中。关于这一点以后有时间,我再研究。
function tableName 就是返回你要使用的数据库的表名,这个函数由框架调用,此例中我们要使用的表名就是tbl_test。
function rules, 这个函数主要用于模型数据的校验,关于这个部分,我们在此例中并不会涉及,所以其函数体为空,其实你将其完全删除也是没有关系。
11. 访问model
接下来我们就使用的我们前面创建的数据表和模型。为了让你了解Yii中是怎么样访问的数据库的数据,这里我们只从controller读取数据,并不去和view连在一起练习,接下来的一节再来把view加入进来看 M(model), V( view ), C(controller)这3部分在Yii在是怎么样协同工作的。
新创建一个action,命名为read,这个action就是为了读取tbl_test这个表中我们刚才插入的两条记录,想想我们刚才是怎么来定义action的,
public function actionRead()
是这个样子对吧。
然后使用Yii提供的访问的数据库的方法,这里说一下,Yii提供的访问的数据库的方法有很多种,我们这里只使用其中的一种,因为这种方法完全能够完成我们的任务了。关于更多的访问数据库的方法,请参考:
http://www.yiiframework.com/doc/guide/1.1/en/database.overview
这里我们使用
$result=[model class name]::model()->findAll($condition,$params);
这种方法,因为我们要表中所有的数据,如果只是返回表中满足条件的一条记录,可以使用
$result=[model class name]::model()->find($condition,$params);
发现了没有区别只是,有All和没有All而已。
model class name部分换成你的模型的类名,此例中是Test,因此变成
$result=Test::model()->findAll($condition,$params);
$condition是条件,比如说是id等于多少,或者name是什么就可以写成 'id=:ID', 'name=:name'
$params是参数列表,是给$condition中的变量给出具体的值,例如: array( ':ID' =>5 )或者是array( ':name'=>'juice')。
因为我们要取出所有的数据,因此我们不需要什么条件,因此$condition和$params都为空。
$result就是返回的结果,如果findAll返回一个数组,find返回一个对象,如果没有找到记录findAll和find都返回null。
这样我们这条语句就该写成:
$result=Test::model()->findAll('','');
接下来就是判断结果是否为空,然后取出数组的数据,整个函数的实现就是下面这个样子:
$test = Test::model()->findAll('', array()); if ( null != $test ) { for ( $i = 0; $i < count( $test ); ++$i ) { echo $test[$i]->name; echo '<br>'; } } else{ echo 'no record exists'; }
保存,然后访问:
http://localhost/testpro/index.php?r=test/read
这个url不需要解释吧,test是controller,read是action。
看到什么结果
lucy
joan
对了,是不是我们刚才插入数据库中的2条的记录的名字。
12. 联合controller, view , model
上面的代码按照的Yii的规范,是有毛病的。因为Yii规定在controller里面是不容许输出的,结果我们echo,输出了,这些输出Yii建议是在view中进行。其实想想也对,因为这样才更好的体现了MVC的设计思想,controller控制逻辑,而不是负责输出。
好,接下来我们看看如何在view中输出这些东西。
想要在view中输出,那么view需要知道要输出的是什么数据,数据的是在controller里面获取到的,这样我们就需要把数据传到view中去。看看我们前面的例子,我们render页面的那一句,
$this->render( 'index' )
其实Controller::render()这个函数还有第二个参数,第二个参数是一个数组,我们可以通过这个数组把我们的数据派发到view中,知道怎么做了,我们来动手写代码。那就是:
$this->render( 'read', array( 'model'=>$test);
read是我们的view的名字,这个没有什么好解释的,model是一个变量名,你可以随便取,$test是我们要真正传入的数据,把整个代码合起来就变成:
public function actionRead() { $test = Test::model()->findAll('', array()); if ( null != $test ) { $this->render( 'read', array( 'model'=>$test, )); } else{ echo 'no record exists'; } }
接下来,创建我们现实数据的视图。去到viewstest目录,创建一个read.php文件,其中输入:
<div> <?php for ( $i = 0; $i < count( $model ); ++$i ) { echo $model[$i]->name; echo '<br>'; } ?> </div>
简单吧,就是访问我们从controller中传过来的$model变量,然后数据其name的值。
好了,还是用刚才的url去访问,看看是不是同样的效果。也许你可以再往数据库中插入几条记录试试。
是不是不怎么美观,要美观就自己去定义read.php的布局什么的。我们这里为了说明怎么在Yii中访问数据而已。
现在我们可以读取数据表中的数据,写数据还是通过mysql 的命令行,实际应用你不能让用户这样做吧,接下来我们接看看怎么写数据库了。这部分我们会在
一步一步学Yii开发(三)
中进行详细讲解。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.