您的位置:首页 > 编程语言 > PHP开发

yii框架-控制器/数据模型

2016-03-06 19:48 639 查看

Yii框架

命名空间

相同类名在不同的命名空间里,会被认为是不同的类

实例化类的时候 new 命名空间 类

use关键字 use 命名空间 类 默认后面使用的就都是声明命名空间里的类

use后,若要再使用指定命名空间里的类,可 use 命名空间 as 新的名字

不在命名空间里的类,是全局类 new \类名 指的就是实例化顶层类

Yii框架 控制器

请求组件

yii框架全局类里的请求组建:Yii::$app->request;

Yii::$app->request->get('id',20);   //第二个参数指若id没有传值,默认用第二个值

Yii::$app->request->isGet/isPost    //判断请求类型

Yii::$app->request->userIp;          //获取请求的ip地址


响应组件

$res =  Yii::$app->response;

$res->statusCode = 404;       //状态码设置

$res->headers->add('pragma','no-cache');    //消息头设置,不缓存消息

$res->headers->set('pragma','max-age=5');    //消息头设置,缓存5s

$res->headers->remove('pragma');    //消息头设置,移除

//跳转

$res->headers->add('location','http://home.corp.elong.com')

Yii的Controller提供专门函数:   $this->redirect('http://home.corp.elong.com')

//文件下载

$res->headers->add('content-disposition','attatchment',"filename='a.jpg'")  ;

Yii提供包装方法:  $res->sendFile('./b.jpg'); //将消息存到b.jpg


session

//session组件

$session = Yii::$app->session;

$session->isActive;        //判断session是否被开启

$session->open();          //开启session

$session->set('user','hangview');    //前面变量,后面值,保存位置在php.ini里设置

$session->get('user');          //取数据

$session->remove('user');     //删除数据

//数组形式设置

$session['user'] = 'hangview';

unset($session['user']);         //删除数据

//为何session既能当对象,又能当数组使用:
PHP中提供一个ArrayAccess的接口,实现这个接口的类,其对象都可以被当作数组来使用

//不同浏览器向服务器发送请求时,服务器能识别出浏览器来源
浏览器cookie里  PHPSESSIONID 作为入口去服务器对应文件找到session存储值

//response组件cookies集合
$cookies = Yii::$app->response->cookies;
$cookie_data = ['name'=>'user','value'=>'hangview'];
$cookies->add(new yii\web\Cookie($cookie_data));    //写cookie,值经过加密;修改的话重新插一次值即可
$cookies->remove('user');           // 删除cookie

//从请求中拿到cookie数据,用到请求组件里的cookie集合
$cookies = Yii::$app->request->cookies;
$cookies->getValue('user',20);         //想拿哪个拿哪个,不存在的值默认用第二个参数作为返回值

//config  web.php
'cookieValidationKey' =>               //用来给cookie加密


view

yii\helpers\Html

Html::encode(); //跨站脚本攻击

Yii框架 数据模型

数据模型

活动记录 yii\db\ActiveRecord

单表查询数据:

findBySql

//class Test extends ActiveRecord{}

$sql = 'select * from test where id = 1';
$res = Test::findBySql($sql)->all(); //all()将每条sql记录包装成一个对象,然后返回一个数组

//sql注入 : 用户传入参数  $id(如'1 or 1=1',会将所有数据都抓出来 )
$sql = 'select * from test where id = ' . $id;
//占位符,整体带入避免sql注入
$sql = 'select * from test where id = :id';
$res = Test::findBySql($sql,[':id'=>$id])->all();


find

//id=1
Test::find()->where(['id'=>1])->all();

//id>0
Test::find()->where(['>','id',0])->all();

//1<id<2
Test::find()->where(['between','id',1,2])->all();

//title like "%hangview%"
Test::find()->where(['like','title','hangview'])->all();

//查询结果转化为数组,降低内存使用率
Test::find()->where(['like','title','hangview'])->asArray()->all();

//批量查询
foreach(Test::find->batch(1000) as $tests){   //每次拿1000条数据
pirint_r(tests);
}


单表删除数据:

//删除数据
$res = Test::find()->where(['id'=>1])->all();
$res[0]->delete();

Test::deleteAll('id>:id',['id'=>0]);


添加数据:

//增加数据
$test = new Test;
$test->id  = 1;
$test->title = 'hangview'
$test->validate();           //启用rules校验
if($test->hasErrors()){      //错误处理

}
$test->save();

//合法验证
//TEST
public function rules(){

return [                            //验证器
['id','integer'],
['title','string',length=>[0,5]],
];
}


修改数据

$test = Test::find()->where['id'=>4]->one();
$test->title = 'hang';
$test->save();


关联查询

//获取顾客对应订单信息

$customer = Customer::find()->where(['name'=>'hangview'])->one();
$orders = $customer->hasMany('Order::className(),['customerId'=> id])->asArray()->all();

//封装
class Customer extends ActiveRecord{
//获取顾客订单信息
public function getOrders(){
$return $this->hasMany(Order::className(),['customer_id' => 'id'])->asArray();
}
}

$orders = $customer->getOrders();
//当访问对象不存在属性时,php调用__get()方法-》AR里调用get+属性名字:getOrders()->all()
$orders = $customer->orders;

//获取订单对应顾客

$order->hasOne(Customer::className(),['id'=>'customerId'])->asArray();
$order = Order::find()->where(['id'=>1])->one();
$customer = $order->customer;


查询性能问题

//关联查询结果缓存
$orders = $customer->orders; //select * frome order ...
unset($customer->orders);     //  不unset的话会从缓存读取
$orders = $customer->orders;

//关联查询的多次查询

$customers = Customer::find()->all();
foreach($customers as $customer){
$orders = $customer->orders;                    //每次访问都会去赌一次数据库,效率很低
}

//with(属性)   selsect * from Order where customerId in(....)     //只进行一次数据库查询即可
$customers = Customer::find()->with('orders')->all();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: