例項講解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();

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

總結

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

您可能感興趣的文章:

Yii2中使用join、joinwith多表關聯查詢Yii2 ActiveRecord多表關聯及多表關聯搜尋的實現Yii2中多表關聯查詢hasOne hasMany的方法