-
基礎(chǔ)篇總結(jié)查看全部
-
//2.關(guān)聯(lián)查詢的多次查詢 /*$customers = Customer::find()->all();//假設(shè)在顧客表里有100個(gè)顧客,全部選出來。select * from customer(1次) //遍歷100位顧客,把每一位顧客塞到$customer變量中 foreach($customers as $customer){ //每個(gè)顧客都通過orders屬性去訪問他的訂單數(shù)據(jù),每次都執(zhí)行select語句 $orders = $customer->orders;//select * from order where customer_id=...(100次),加上上面的1次,總共會(huì)調(diào)用101次sql查詢,執(zhí)行起來慢,會(huì)拖累整個(gè)代碼的運(yùn)行。 }*/ //Yii框架為了優(yōu)化這種查詢,提供了一個(gè)with()的方法。只執(zhí)行了2次sql查詢。 //sql語句會(huì)變成,先select * from customer;再select * from order where customer_id in(...)[這里的...不代表某一位顧客的id,它代表所有顧客id的集合]。選取出所有顧客的訂單信息,再塞入每個(gè)顧客的orders屬性中。那么在foreach里調(diào)用orders屬性時(shí),不會(huì)再執(zhí)行select語句。 $customers = Customer::find()->with('orders')->all();//選取出所有的顧客,然后顧客里的orders屬性給填上值 foreach($customers as $customer){ $orders = $customer->orders;}查看全部
-
//數(shù)據(jù)模型之關(guān)聯(lián)查詢性能問題 //1.關(guān)聯(lián)查詢結(jié)果緩存 /*$customer = Customer::find()->where(['name'=>'wangdachui'])->one(); $orders = $customer->orders;//第1次使用wangdachui訂單數(shù)據(jù)時(shí),實(shí)際上執(zhí)行了select * from order where customer_id=... unset($customer->orders;);//如果更新了wangdachui的訂單數(shù)據(jù),還想從數(shù)據(jù)庫拿數(shù)據(jù),那么拿數(shù)據(jù)之前通過unset()方法把wangdachui對(duì)應(yīng)的訂單信息給釋放掉,之后再獲取orders的時(shí)候可以到數(shù)據(jù)庫拿數(shù)據(jù),也就是再執(zhí)行select語句 $orders2 = $customer->orders;//第2次從wangdachui訂單獲取orders屬性時(shí),不會(huì)再執(zhí)行select語句,因?yàn)榈?次已經(jīng)訪問了數(shù)據(jù)庫并把數(shù)據(jù)塞到了orders里,所以第2次直接從orders里拿數(shù)據(jù)就可以了。查看全部
-
HelloController.php //根據(jù)訂單查詢顧客的信息(一對(duì)一:hasOne) $order = Order::find()->where(['id'=>1])->one(); //$order->getCustomer()->one(); $customer = $order->customer;//直接調(diào)用customer屬性去幫助獲取顧客的信息 print_r($customer); Order.php namespace app\models; use yii\db\ActiveRecord; class Order extends ActiveRecord{ //根據(jù)訂單查詢顧客的信息 public function getCustomer(){ return $this->hasOne(Customer::className(),['id'=>'customer_id'])->asArray();//$this代表訂單,調(diào)用hasOne('顧客完整的活動(dòng)記錄的類名','顧客和訂單之間的對(duì)應(yīng)關(guān)系')方法。通過return把這段代碼的執(zhí)行結(jié)果返回出去。 } }查看全部
-
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活動(dòng)記錄當(dāng)中并沒定義orders屬性,按理說使用orders會(huì)返回一個(gè)空值,怎么會(huì)返回$orders訂單數(shù)據(jù)呢?原因是當(dāng)訪問$customer對(duì)象(Customer活動(dòng)記錄的實(shí)例)里不存在的屬性時(shí),PHP會(huì)去調(diào)用__get()函數(shù); //__get()函數(shù)在活動(dòng)記錄里會(huì)去自動(dòng)調(diào)用一個(gè)(get+屬性名字)的方法,也就是getOrders(),調(diào)用完之后__get()函數(shù)會(huì)在后面自動(dòng)補(bǔ)上一個(gè)all()方法。把通過all()方法抓取的數(shù)據(jù)返回給$orders變量。這個(gè)自動(dòng)補(bǔ)上的all()方法會(huì)與Customer.php里getOrders()函數(shù)的all()[刪掉這個(gè)all()]方法沖突。 $orders = $customer->orders;//優(yōu)化:Yii框架允許通過屬性的方式直接獲取訂單數(shù)據(jù)。 print_r($orders); Customer.php public function getOrders(){ $orders = $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray();//優(yōu)化的$orsers,刪掉all()。 return $orders;//獲取了訂單數(shù)據(jù)之后再返回出去 }查看全部
-
configuration查看全部
-
cookiesValidationKey security key查看全部
-
HelloController.php use app\models\Customer; use app\models\Order; //數(shù)據(jù)模型之關(guān)聯(lián)查詢 //根據(jù)顧客查詢他/她的訂單的信息 $customer = Customer::find()->where(['name'=>'wangdachui'])->one();//one()方法直接把wangdachui以對(duì)象的形式返回,通過$customer變量(實(shí)際上是Customer類的一個(gè)實(shí)例)來接收 //$orders = $customer->hasMany('app\models\Order',['customer_id'=>'id'])->asArray()->all();//專門的關(guān)聯(lián)查詢的方法hasMany('訂單的活動(dòng)記錄類全稱','訂單和顧客之間的關(guān)聯(lián)關(guān)系') //改進(jìn)點(diǎn)1:'app\models\Order'訂單的活動(dòng)記錄類可以通過調(diào)用Order里的className()靜態(tài)方法(從ActiveRecord父類里獲取的)來獲取。 //$orders = $customer->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all(); //改進(jìn)點(diǎn)2:把獲取訂單的這個(gè)邏輯通過getOrders()方法封裝起來,因?yàn)橛唵潍@取的邏輯涉及到表的一些信息,一旦數(shù)據(jù)庫表信息發(fā)生修改,那么會(huì)影響到控制器也做出相應(yīng)的修改(這段邏輯代碼)。也就導(dǎo)致了控制器和這個(gè)數(shù)據(jù)模型產(chǎn)生了一定的耦合。 //$orders = $customer->getOrders();//$customer對(duì)象是Customer類的實(shí)例,所以直接調(diào)用getOrders()函數(shù)。 print_r($orders); Customer.php //專門寫一個(gè)函數(shù)幫助顧客獲取訂單信息 public function getOrders(){ $orders = $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all();//$this代表當(dāng)前實(shí)例化出來的顧客 return $orders;//獲取了訂單數(shù)據(jù)之后再返回出去 }查看全部
-
入口腳本 web/index.php查看全部
-
requirements.php 檢測(cè)系統(tǒng)環(huán)境查看全部
-
foundation infrastructure查看全部
-
//數(shù)據(jù)模型之單表數(shù)據(jù)修改 //修改數(shù)據(jù);all()方法返回的是一個(gè)數(shù)組,數(shù)組里有一個(gè)id=4的元素,它被轉(zhuǎn)化為了對(duì)象。通過one()快捷方法得到數(shù)組里的一個(gè)元素。 $test = Test::find()->where(['id'=>4])->one();//通過one()方法把得到的id=4的數(shù)據(jù)轉(zhuǎn)化成對(duì)象放進(jìn)$test中 $test->title = 'title4';//要修改$test里對(duì)應(yīng)的值的話直接修改$test里屬性的值就可以了 $test->save();查看全部
舉報(bào)
0/150
提交
取消