实际项目中PHP肯定离不开数据库,YII框架有很多针对数据库的操作,学习一下。学习YII框架数据库指令的同时,也可以学到YII框架的数据模型,一石二鸟啊。另外,昨天发布了第一篇后,发现有几十个人看了我的http://blog.youkuaiyun.com/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.编写数据模型
4.控制器调用数据库操作。
其实yii框架调用数据库操作的过程可以用一句话来说明,就是把数据从表里面拿出来放到对象里面,通过对象的方法来达到对数据库的操作。
先说说查找,等下再说增删改。比如我要查找数据库里面id在1和9之间的数据,就可以调用刚刚建的Test类的find方法,查找
然而,在实际使用中,用户可能输入超出长度之类的违法输入,这个时候,前面建的数据模型就真正派上用场了。在model下的test.php,Test类里面加入rules方法
改的话,和增类似,不过是把新建对象变成查找。也可以加输入验证。
最后讲一个高级点的东西,关联查询,就是两个表关联查询。比如我有一个顾客列表customer,订单列表orders。就可以通过关联查询得知顾客列表中的顾客在订单列表中的订单。现在数据库中建这两个表。customer有id,name项。orders有id,c_id(对应顾客id)和price项。
其中 $customer->hasMany('app\models\Order',['c_id'=>'id'])->asArray()->all();可以放到数据模型。就不写了。
终于把基础的基础讲完了。预告,下周学习高效篇。
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,新建\yii\db\ActiveRecord子类Test。
namespace app\models;
use yii\db\ActiveRecord;
class Test extends \yii\db\ActiveRecord{
}
这样数据模型就建好了。接下来可以在控制器里面调用。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('app\models\Order',['c_id'=>'id'])->asArray()->all();
$orders = $customer->getOrders();
$orders = $customer->orders;//访问一个不存在的属性时,
print_r($orders);
其中 $customer->hasMany('app\models\Order',['c_id'=>'id'])->asArray()->all();可以放到数据模型。就不写了。
终于把基础的基础讲完了。预告,下周学习高效篇。