-
基础篇总结查看全部
-
//2.关联查询的多次查询 /*$customers = Customer::find()->all();//假设在顾客表里有100个顾客,全部选出来。select * from customer(1次) //遍历100位顾客,把每一位顾客塞到$customer变量中 foreach($customers as $customer){ //每个顾客都通过orders属性去访问他的订单数据,每次都执行select语句 $orders = $customer->orders;//select * from order where customer_id=...(100次),加上上面的1次,总共会调用101次sql查询,执行起来慢,会拖累整个代码的运行。 }*/ //Yii框架为了优化这种查询,提供了一个with()的方法。只执行了2次sql查询。 //sql语句会变成,先select * from customer;再select * from order where customer_id in(...)[这里的...不代表某一位顾客的id,它代表所有顾客id的集合]。选取出所有顾客的订单信息,再塞入每个顾客的orders属性中。那么在foreach里调用orders属性时,不会再执行select语句。 $customers = Customer::find()->with('orders')->all();//选取出所有的顾客,然后顾客里的orders属性给填上值 foreach($customers as $customer){ $orders = $customer->orders;}查看全部
-
//数据模型之关联查询性能问题 //1.关联查询结果缓存 /*$customer = Customer::find()->where(['name'=>'wangdachui'])->one(); $orders = $customer->orders;//第1次使用wangdachui订单数据时,实际上执行了select * from order where customer_id=... unset($customer->orders;);//如果更新了wangdachui的订单数据,还想从数据库拿数据,那么拿数据之前通过unset()方法把wangdachui对应的订单信息给释放掉,之后再获取orders的时候可以到数据库拿数据,也就是再执行select语句 $orders2 = $customer->orders;//第2次从wangdachui订单获取orders属性时,不会再执行select语句,因为第1次已经访问了数据库并把数据塞到了orders里,所以第2次直接从orders里拿数据就可以了。查看全部
-
HelloController.php //根据订单查询顾客的信息(一对一:hasOne) $order = Order::find()->where(['id'=>1])->one(); //$order->getCustomer()->one(); $customer = $order->customer;//直接调用customer属性去帮助获取顾客的信息 print_r($customer); Order.php namespace app\models; use yii\db\ActiveRecord; class Order extends ActiveRecord{ //根据订单查询顾客的信息 public function getCustomer(){ return $this->hasOne(Customer::className(),['id'=>'customer_id'])->asArray();//$this代表订单,调用hasOne('顾客完整的活动记录的类名','顾客和订单之间的对应关系')方法。通过return把这段代码的执行结果返回出去。 } }查看全部
-
summary; conclusion; sum up; summarize查看全部
-
handle procedure/process treatment flowsheet查看全部
-
configuration www/basic/config/web.php查看全部
-
HelloController.php $customer = Customer::find()->where(['name'=>'wangdachui'])->one(); //在Customer活动记录当中并没定义orders属性,按理说使用orders会返回一个空值,怎么会返回$orders订单数据呢?原因是当访问$customer对象(Customer活动记录的实例)里不存在的属性时,PHP会去调用__get()函数; //__get()函数在活动记录里会去自动调用一个(get+属性名字)的方法,也就是getOrders(),调用完之后__get()函数会在后面自动补上一个all()方法。把通过all()方法抓取的数据返回给$orders变量。这个自动补上的all()方法会与Customer.php里getOrders()函数的all()[删掉这个all()]方法冲突。 $orders = $customer->orders;//优化:Yii框架允许通过属性的方式直接获取订单数据。 print_r($orders); Customer.php public function getOrders(){ $orders = $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray();//优化的$orsers,删掉all()。 return $orders;//获取了订单数据之后再返回出去 }查看全部
-
configuration查看全部
-
cookiesValidationKey security key查看全部
-
HelloController.php use app\models\Customer; use app\models\Order; //数据模型之关联查询 //根据顾客查询他/她的订单的信息 $customer = Customer::find()->where(['name'=>'wangdachui'])->one();//one()方法直接把wangdachui以对象的形式返回,通过$customer变量(实际上是Customer类的一个实例)来接收 //$orders = $customer->hasMany('app\models\Order',['customer_id'=>'id'])->asArray()->all();//专门的关联查询的方法hasMany('订单的活动记录类全称','订单和顾客之间的关联关系') //改进点1:'app\models\Order'订单的活动记录类可以通过调用Order里的className()静态方法(从ActiveRecord父类里获取的)来获取。 //$orders = $customer->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all(); //改进点2:把获取订单的这个逻辑通过getOrders()方法封装起来,因为订单获取的逻辑涉及到表的一些信息,一旦数据库表信息发生修改,那么会影响到控制器也做出相应的修改(这段逻辑代码)。也就导致了控制器和这个数据模型产生了一定的耦合。 //$orders = $customer->getOrders();//$customer对象是Customer类的实例,所以直接调用getOrders()函数。 print_r($orders); Customer.php //专门写一个函数帮助顾客获取订单信息 public function getOrders(){ $orders = $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all();//$this代表当前实例化出来的顾客 return $orders;//获取了订单数据之后再返回出去 }查看全部
-
入口脚本 web/index.php查看全部
-
requirements.php 检测系统环境查看全部
-
foundation infrastructure查看全部
-
//数据模型之单表数据修改 //修改数据;all()方法返回的是一个数组,数组里有一个id=4的元素,它被转化为了对象。通过one()快捷方法得到数组里的一个元素。 $test = Test::find()->where(['id'=>4])->one();//通过one()方法把得到的id=4的数据转化成对象放进$test中 $test->title = 'title4';//要修改$test里对应的值的话直接修改$test里属性的值就可以了 $test->save();查看全部
举报
0/150
提交
取消