實(shí)例講解YII2中多表關(guān)聯(lián)的使用方法
前言
本文對(duì) YII2.0 的多表關(guān)聯(lián)查詢做一個(gè)簡(jiǎn)單的介紹。文中通過實(shí)例代碼介紹的非常詳細(xì),下面話不多說,來一起看看詳細(xì)的介紹:
首先先來說明一下表結(jié)構(gòu)
表結(jié)構(gòu)
現(xiàn)在有訂單表、用戶表、商品清單表、商品庫存表
在YII中,如果想直接關(guān)聯(lián)其他表進(jìn)行查詢的話,需要先在模型里定義它們的關(guān)聯(lián)
Order
class Order extends \yii\db\ActiveRecord.{ // 關(guān)聯(lián)函數(shù)以get+要關(guān)聯(lián)的數(shù)據(jù)表名來命名 // 這是獲取下訂單的客戶 public function getUser(){ // 第一個(gè)參數(shù)為要關(guān)聯(lián)的子表模型類名, // 第二個(gè)參數(shù)指定 通過子表的user_id,關(guān)聯(lián)主表的usesr_id字段 // 這里寫清楚點(diǎn)大概意思就是User.user_id => Order.user_id return $this->hasMany(User::className(), ['user_id' => 'user_id']); } }
1、hasMany、hasOne使用
Yii2中的表之間的關(guān)聯(lián)有2種,它們用來指定兩個(gè)模型之間的關(guān)聯(lián)。
●一對(duì)多:hasMany ●一對(duì)一:hasOne
●返回結(jié)果:這兩個(gè)方法的返回結(jié)果都為yiidbActiveQuery對(duì)象(如果你想最后返回的是標(biāo)準(zhǔn)數(shù)組形式,記得加上asArray()參數(shù))
●第一個(gè)參數(shù):所關(guān)聯(lián)的模型的類名稱。
●第二個(gè)參數(shù):是一個(gè)數(shù)組,其中鍵為所關(guān)聯(lián)的模型中的屬性,值為當(dāng)前模型中的屬性。
關(guān)聯(lián)的使用
現(xiàn)在我們來嘗試獲取一個(gè)訂單
//獲取訂單信息 $order = Order::findOne(1); //根據(jù)訂單信息獲取到用戶信息 $user = $order->user;
當(dāng)然你可以選擇使用with方法,這樣看起來簡(jiǎn)潔一些,其中with的參數(shù)為關(guān)系的名稱,也就在model里面定義的getUser中的user.
//返回訂單信息(包括用戶信息) $order = Order::find(1)->with('user'); //或者 $order = Order::find(1)->getUser();
上面的代碼會(huì)生成并執(zhí)行如下的sql語句
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
從上面可以看出訪問一個(gè)關(guān)聯(lián)的時(shí)候有兩種方法
●如果以函數(shù)的方式調(diào)用,會(huì)返回一個(gè) ActiveQuery 對(duì)象($customer->getOrders()->all())
●如果以屬性的方式調(diào)用,會(huì)直接返回模型的結(jié)果($customer->orders)
關(guān)聯(lián)結(jié)果緩存
如果這時(shí)order表發(fā)生了改變,我們希望再次查詢的話
$user = $order->user;
再次得到訂單的時(shí)候你會(huì)發(fā)現(xiàn)沒有變化。原因是只會(huì)在第一次執(zhí)行$order->user的時(shí)候才會(huì)去數(shù)據(jù)庫里面查詢,然后會(huì)把結(jié)果緩存起來,以后查詢的時(shí)候都不會(huì)再執(zhí)行sql。
那么如果你想再次執(zhí)行sql如何做呢?可以執(zhí)行
//先釋放緩存 unset($order->user); $order->user;
跨表查詢
下面重點(diǎn)來了!通過上面表結(jié)構(gòu)的圖可以看到,User表和Order_goods表示沒有直接關(guān)聯(lián)的,那么如果我們想根據(jù)用戶信息查找這個(gè)用戶買了哪些商品的話,就勢(shì)必需要通過Order表去關(guān)聯(lián)兩張表。那么該怎么做呢?首先還是model層。因?yàn)槲覀兪歉鶕?jù)用戶去查,所以到User的model層去定義關(guān)聯(lián)。
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中的第二個(gè)order_id是指getOrder關(guān)聯(lián)的Order中的order_id,第一個(gè)order_id是指OrderGoods中的order_id。
但是!我們還有最簡(jiǎn)單的方法,那就是使用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();
這樣基本就是整個(gè)關(guān)聯(lián)部分了
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Yii框架參數(shù)配置文件params用法實(shí)例分析
這篇文章主要介紹了Yii框架參數(shù)配置文件params用法,結(jié)合實(shí)例形式分析了Yii框架參數(shù)配置文件params相關(guān)設(shè)置、調(diào)用、加載等操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-09-09symfony3.4中根據(jù)角色不同跳轉(zhuǎn)不同頁面功能
這篇文章主要介紹了symfony3.4中根據(jù)角色不同跳轉(zhuǎn)不同頁面,在Symfony?3.4中,可以使用安全組件來實(shí)現(xiàn)控制不同角色跳轉(zhuǎn)到不同頁面的功能,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08php redis 處理websocket聊天記錄的實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了php redis 處理websocket聊天記錄的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07ThinkPHP中I(),U(),$this->post()等函數(shù)用法
這篇文章主要介紹了ThinkPHP中I(),U(),$this->post()等函數(shù)用法,簡(jiǎn)單分析了ThinkPHP處理表單的常用函數(shù)使用方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11php設(shè)計(jì)模式之享元模式分析【星際爭(zhēng)霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之享元模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了PHP享元模式的相關(guān)原理與使用技巧,需要的朋友可以參考下2020-03-03php開發(fā)最強(qiáng)大的IDE編輯的phpstorm 2020.2配置Xdebug調(diào)試的詳細(xì)教程
這篇文章主要介紹了php開發(fā)最強(qiáng)大的IDE編輯的phpstorm 2020.2配置Xdebug調(diào)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08詳解PHP使用Redis存儲(chǔ)session時(shí)的一個(gè)Warning定位
本篇文章主要介紹了PHP使用Redis存儲(chǔ)session時(shí)的一個(gè)Warning定位,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07