牛骨文教育服务平台(让学习变的简单)
博文笔记

YII2框架学习 基础篇(二) YII2数据库操作

创建时间:2017-06-04 投稿人: 浏览次数:234
实际项目中PHP肯定离不开数据库,YII框架有很多针对数据库的操作,学习一下。学习YII框架数据库指令的同时,也可以学到YII框架的数据模型,一石二鸟啊。另外,昨天发布了第一篇后,发现有几十个人看了我的http://blog.csdn.net/m0_37645820/article/details/72855543,YII2框架学习 基础篇(一)。自己看了看,排版太差了,以后好好写。
1.xmapp建数据库
因为是用的xampp建站,这次用的数据库是**mysql**,先在xampp把mysql打开。打开后进到http://localhost/phpmyadmin/,就可以看见数据库了。在mysql新建库名为yii,新建表名为test,表头为id和name,然后随便输入点数据就行了,准备工作完毕。
2.修改yii数据库配置
然后需要修改一下config文件夹下db.php文件里面的dsn值为"dsn" => "mysql:host=localhost;dbname=yii"。这样yii框架就可以使用刚刚建好的数据库了
3.编写数据模型

在models下新建php文件名为Test,新建yiidbActiveRecord子类Test。

namespace appmodels;
use yiidbActiveRecord;
class Test extends yiidbActiveRecord{

}
这样数据模型就建好了。接下来可以在控制器里面调用。
4.控制器调用数据库操作。
其实yii框架调用数据库操作的过程可以用一句话来说明,就是把数据从表里面拿出来放到对象里面,通过对象的方法来达到对数据库的操作。 
先说说查找,等下再说增删改。比如我要查找数据库里面id在1和9之间的数据,就可以调用刚刚建的Test类的find方法,查找

Test::find()->where(["between","id",1,9])->asArray()->all();
注意,此处的asArray作用是把取出来的对象转化成数组,这么做是为了节省内存。同时,还有一种办法可以节省内存,因为之前说过了,把数据从表里面拿出来放到对象里面,

通过对象的方法来达到对数据库的操作。asArray把结果变成数组,就无法操作了,此时可以通过php中最常用的foreach达到效果。

此外,yii还提供很多查询方式,比如like之类的,有兴趣的可以上www.yiichina.com里面有中文文档,很有用。下面列举一些我练手的时候写的代码

	//$sql = "select * from test where id=:id";
        //$res = Test::findBySql($sql,array(":id"=>""))->all();
       /* $res = Test::find()->where(["id"=>8])->all();*/
       /* $res = Test::find()->where([">","id",7])->all();*/
        /*$res = Test::find()->where(["between","id",7,9])->all();*/
        /*        $res = Test::find()->where(["like","title","e"])->all();*/
        //$res = Test::find()->where(["between","id",1,9])->asArray()->all();
接下讲增,先新建Test对象,写入id和name属性,然后调用save方法。就可以了。

        $test = new Test;
        $test->id ="4";
        $test->title = "baa";
        $test->save();

然而,在实际使用中,用户可能输入超出长度之类的违法输入,这个时候,前面建的数据模型就真正派上用场了。在model下的test.php,Test类里面加入rules方法

public function  rules(){
        return[
            ["id","integer"],
            ["title","string","length"=>[0,5]]
        ];
}
同时,刚刚在控制器写入的代码也要修改

$test = new Test;
        $test->id ="4";
        $test->title = "baa";
        $test->validate();
        if($test->hasErrors()){
            echo "error";
            die;
        }
        $test->save();
这样我们就可以对输入进行验证了,是不是很方便。

改的话,和增类似,不过是把新建对象变成查找。也可以加输入验证。

	$res = Test::find()->where(["id"=>4])->one();
        $res->title = "qwqq";
        $res->save();
删太简单了,就顺便讲个yii很实用的功能。为了防止用户在输入搞鬼,自加条件,如输入id为0||0=0查找;那么肯定是会全部通过的,全部数据库就暴露了。这种时候,

可以用yii的技巧。比如删除id>0的数据,可以这么写

Test::deleteAll("id>:id",array(":id"=>"0"));

最后讲一个高级点的东西,关联查询,就是两个表关联查询。比如我有一个顾客列表customer,订单列表orders。就可以通过关联查询得知顾客列表中的顾客在订单列表中的订单。现在数据库中建这两个表。customer有id,name项。orders有id,c_id(对应顾客id)和price项。

	$customer = Customer::find()->where(["name"=>"zhangsan"])->one();
        $orders = $customer->hasMany("appmodelsOrder",["c_id"=>"id"])->asArray()->all();
        $orders = $customer->getOrders();
        $orders = $customer->orders;//访问一个不存在的属性时,
        print_r($orders);

其中 $customer->hasMany("appmodelsOrder",["c_id"=>"id"])->asArray()->all();可以放到数据模型。就不写了。
终于把基础的基础讲完了。预告,下周学习高效篇。




声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。