`Customer.php`:
~~~
class Customer extends \yii\db\ActiveRecord
{
public function getOrder()
{
//第一個customer_id是Order表中的字段,第二個customer_id是Customer表中的字段
//比如查詢1號訂單的顧客資料,1號訂單的customer_id=1
//然后在Customer表中查詢customer_id=1的顧客資料
return $this->hasMany(Order::className(),['customer_id' => 'customer_id'])->asArray()->all();
}
}
~~~
* * * * *
`Order.php`
~~~
class Order extends \yii\db\ActiveRecord
{
public function getCustomer()
{
//第一個customer_id是Customer表中的字段,第二個customer_id是Order表中的字段
//比如查詢zhangsan的訂單,zhangsan的customer_id=1
//然后在Order表中查詢customer_id=1的訂單
return $this->hasOne(Customer::className(),['customer_id' => 'customer_id'])->asArray()->one();
}
}
~~~
* * * * *
控制器的方法:
~~~
function actionOrder()
{
/******************************* 關聯查詢 ****************************/
/********** 1、根據顧客名字查詢顧客訂單,顧客1:n訂單 ******/
//查詢zhangsan的訂單
$customer = Customer::find()->where(['name' => 'zhangsan'])->one();
$order = $customer->getOrder();
print_r($order);
/********** 2、根據訂單查詢顧客名字,訂單1:1顧客 *********/
//查詢1號訂單的顧客資料
$order = Order::find()->where(['order_id' => 1])->one();
$customer = $order->getCustomer();
print_r($customer);
/**** $customer = $orders->customer;
* 3、當訪問不存在的屬性時$orders->customer,php會自動調用__get()
* 即$orders->customer相當于調用$orders->getCustomer()
* 同時還會在末尾自動補上one()方法,即$orders->getCustomer()->one()
* 因此,當你使用$orders->customer時,要在getCustomer()方法末尾要去掉one() *****/
/********************* 關聯查詢問題1:關聯查詢結果會被緩存 **********************/
/* 當你執行 $order=Order::find()->where(['order_id' => 1])->one() 時,往數據表進行了查詢
* 第二次執行 $order=Order::find()->where(['order_id' => 1])->one() 時則不會從數據表中進行查詢,會直接從緩存中讀取
* 所以當你更新數據表的時候,你查詢到的結果卻沒有更新,此時你需要先unset($order)刪除緩存再從數據表中查詢 */
/********************* 關聯查詢問題2:關聯查詢的多次查詢 **********************/
$customers=Customer::find()->all(); //1次sql語句select * from customer
foreach($customers as $customer){
//如果Customer表中有100條記錄,則會執行100次sql語句select * from order where customer_id=...
print_r($customer->order);
}
/*解決方法:加上with('order')
* select * from customer,select * from order where customer_id in(...),這時的...表示所有顧客customer_id的集合
* 選取所有顧客的customer_id塞到各自的order屬性,執行下面foreach時不會再有sql語句,這里只執行了2次sql語句*/
/*$customers=Customer::find()->with('order')->all();
foreach($customers as $customer){
print_r($customer->order);
}*/
}
~~~
- 前文
- 安裝前的準備
- windows安裝Composer
- Linux安裝Composer
- 開始使用
- 安裝yii2.0
- 初始化項目
- 檢測運行環境
- 數據庫
- 連接數據庫
- 添加
- 查詢
- join
- joinWith
- with
- asArray
- offset
- filterWhere
- 關聯查詢
- 更新
- AR更新
- with和JoinWith的區別?
- Yii2.0框架基礎--數據查詢之AR類方法一
- 數據庫遷移Migration
- 查看最后執行SQL語句
- 事務處理
- 例子
- 控制器
- rules驗證方法
- behaviors行為
- actions動作
- 模型
- 模型使用
- attributeLabels
- tableName
- fields
- 視圖
- 顯示視圖
- 獲取配置參數
- 格式化時間顯示
- Activeform效果
- Activeform表單部分組件使用方法
- RESTful服務
- 版本化控制
- 郵件mail
- 郵件配置
- 郵件樣板
- session
- Yii2.0 Session操作大全(增、刪、改、銷毀、Session數組賦值、讀取)
- 緩存
- 跨APP讀取緩存(文件緩存)
- Memcache
- 最佳實踐
- 控制器
- 模型
- 視圖
- 常見問題
- 解決根目錄沒有vendor目錄
- 安裝composer-asset插件錯誤
- Url隱藏index.php
- nginx配置
- Apache配置
- 配置
- 設置系統默認中文提示
- 數據庫問題
- where和andWhere不能同時使用嗎?
- debug
- 編輯器使用技巧
- phpstorm
- Redis
- redis安裝
- redis例子
- RBAC
- Redis和memcache概念
- 生成接口文檔
- Swagger安裝
- Swagger語法
- 擴展
- 七牛云存儲
- 視頻縮略圖
- Pjax
- A鏈接不能跳轉解決辦法