詳解YII2多表關聯的使用

*文
發布: 2023-03-19 07:58:01
原創
1801 人瀏覽過

最近專案中遇到了YII2多表關聯的相關問題,並沒有找到合適的資料,於是自己整理了下,方便自己在以後需要的時候或者有需要的朋友們參考學習。本文主要跟大家介紹了關於YII2中多表關聯的使用方法,需要的朋友下面來一起看看吧。希望對大家有幫助。

前言

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

#首先先來說明一下表格結構

#表格結構

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

#在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();
登入後複製
這樣基本上就是整個關聯部分了

相關推薦:

詳解Yii框架批次插入資料的簡單擴展類別

詳解yii2之restful api授權驗證

##Yii解決DeleteAll連表刪除報錯問題

以上是詳解YII2多表關聯的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板