一步一步学Yii开发(二)

一步一步学Yii开发(二)

我们接上篇的

一步一步学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开发(三)

中进行详细讲解。

 

 

 

 

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示