久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

實例講解YII2中多表關聯的使用方法

最近工作中遇到了YII2多表關聯的相關問題,發現網上這方面的資料并不多,所以想著自己整理下吧,方便自己在以后需要的時候或者有需要的朋友們參考學習,下面這篇文章主要給大家

前言

本文對 YII2.0 的多表關聯查詢做一個簡單的介紹。文中通過實例代碼介紹的非常詳細,下面話不多說,來一起看看詳細的介紹:

首先先來說明一下表結構

表結構

現在有訂單表、用戶表、商品清單表、商品庫存表

實例講解YII2中多表關聯的使用方法

實例講解YII2中多表關聯的使用方法

在YII中,如果想直接關聯其他表進行查詢的話,需要先在模型里定義它們的關聯

Order

class Order extends \yii\db\ActiveRecord.{
 
 // 關聯函數以get+要關聯的數據表名來命名
 // 這是獲取下訂單的客戶
 public function getUser(){
  
  // 第一個參數為要關聯的子表模型類名,
  // 第二個參數指定 通過子表的user_id,關聯主表的usesr_id字段
  // 這里寫清楚點大概意思就是User.user_id => Order.user_id
 return $this->hasMany(User::className(), ['user_id' => 'user_id']);
 }
}

1、hasMany、hasOne使用

Yii2中的表之間的關聯有2種,它們用來指定兩個模型之間的關聯。

      ●一對多:hasMany ●一對一:hasOne

      ●返回結果:這兩個方法的返回結果都為yiidbActiveQuery對象(如果你想最后返回的是標準數組形式,記得加上asArray()參數)

      ●第一個參數:所關聯的模型的類名稱。

      ●第二個參數:是一個數組,其中鍵為所關聯的模型中的屬性,值為當前模型中的屬性。

關聯的使用

現在我們來嘗試獲取一個訂單

//獲取訂單信息
$order = Order::findOne(1);
//根據訂單信息獲取到用戶信息
$user = $order->user;

當然你可以選擇使用with方法,這樣看起來簡潔一些,其中with的參數為關系的名稱,也就在model里面定義的getUser中的user.

//返回訂單信息(包括用戶信息)
$order = Order::find(1)->with('user');
//或者
$order = Order::find(1)->getUser();

上面的代碼會生成并執行如下的sql語句

SELECT * FROM order WHERE id=1;
SELECT * FROM user  WHERE user.user_id=order.user_id;

從上面可以看出訪問一個關聯的時候有兩種方法

       ●如果以函數的方式調用,會返回一個 ActiveQuery 對象($customer->getOrders()->all())

       ●如果以屬性的方式調用,會直接返回模型的結果($customer->orders)

關聯結果緩存

如果這時order表發生了改變,我們希望再次查詢的話

$user = $order->user;

再次得到訂單的時候你會發現沒有變化。原因是只會在第一次執行$order->user的時候才會去數據庫里面查詢,然后會把結果緩存起來,以后查詢的時候都不會再執行sql。

那么如果你想再次執行sql如何做呢?可以執行

//先釋放緩存
unset($order->user);
$order->user;

跨表查詢

下面重點來了!通過上面表結構的圖可以看到,User表和Order_goods表示沒有直接關聯的,那么如果我們想根據用戶信息查找這個用戶買了哪些商品的話,就勢必需要通過Order表去關聯兩張表。那么該怎么做呢?首先還是model層。因為我們是根據用戶去查,所以到User的model層去定義關聯。

User

public function getOrder() {
 return $this->hasMany(Order::className(), ['user_id' => 'user_id']);
}
 
public function getOrderGoods() {
 return $this->hasMany(OrderGoods::className(), ['order_id' => 'order_id'])->
  via('order');
}

這里注意:getOrderGoods中的第二個order_id是指getOrder關聯的Order中的order_id,第一個order_id是指OrderGoods中的order_id。

但是!我們還有最簡單的方法,那就是使用SQL語句啦!

$map = 'select
  user.name,
  order.id,
  order_goods.goods_id,
  goods.goods_name,
  stock.stock_count
  from user
  LEFT JOIN order   ON order.user_id = user.user_id
  LEFT JOIN order_goods ON order_goods.order_id = order.order_id
  LEFT JOIN goods   ON goods.goods_id = order_goods.goods_id
  LEFT JOIN stock   ON stock.goods_id = goods.goods_id';

$list1 = Article::findBySql($map)->asArray()->all();

這樣基本就是整個關聯部分了

總結

以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

Yii2的rule用于對模型屬性進行驗證,scenario用戶定義不同場景下需要驗證的模型,下面這篇文章主要給大家介紹了關于Yii2中場景(scenario)和驗證規則(rule)的相關資料,文中通過示例代碼介
本篇文章主要介紹了淺談使用 Yii2 AssetBundle 中 $publishOptions 的正確姿勢,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了Yii2之組件的注冊與創建的實現方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
這篇文章主要介紹了Yii2使用駝峰命名的形式訪問控制器的實現方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家帶來一篇Yii2使用駝峰命名的形式訪問控制器(實例講解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
這篇文章主要介紹了thinkphp中的多表關聯查詢的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
主站蜘蛛池模板: 午夜精品 | 亚洲最大的成人网 | 日本三级网址 | 欧美一区二区三区视频 | 黄色网址大全在线观看 | 最新超碰 | 久久国产精品免费视频 | 国产欧美久久一区二区三区 | 精品免费在线 | 成人精品网 | 99热视| 91精品一区二区三区久久久久 | 久草免费在线视频 | 日本在线一区二区 | 国产成人精品一区二区三 | 99免费在线观看视频 | 久久久免费| 成人免费视频网站在线看 | 免费看国产一级特黄aaaa大片 | 欧美日韩中文字幕在线 | 日本色婷婷 | 91久久| 麻豆国产一区二区三区四区 | 奇米影视在线 | 成人精品久久日伦片大全免费 | 国产成人精品一区二区三区在线 | 亚洲传媒在线 | 成人日批视频 | 日韩在线91 | av免费看在线| 在线视频成人 | 日韩免费中文字幕 | 狠狠干美女 | 中文字幕在线不卡播放 | 久久久久久国产精品免费免费男同 | 国产一级片一区二区 | 免费一级淫片aaa片毛片a级 | 在线一区视频 | 午夜欧美| 久久久久久国 | 日本三级线观看 视频 |