《PHP應用:實例講解YII2中多表關聯的使用方法》要點:
本文介紹了PHP應用:實例講解YII2中多表關聯的使用方法,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
前言PHP應用
本文對 YII2.0 的多表關聯查詢做一個簡單的介紹.文中通過實例代碼介紹的非常詳細,下面話不多說,來一起看看詳細的介紹:PHP應用
首先先來說明一下表結構PHP應用
表結構PHP應用
現在有訂單表、用戶表、商品清單表、商品庫存表PHP應用
PHP應用
PHP應用
在YII中,如果想直接關聯其他表進行查詢的話,需要先在模型里定義它們的關聯PHP應用
OrderPHP應用
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使用
PHP應用
Yii2中的表之間的關聯有2種,它們用來指定兩個模型之間的關聯.PHP應用
????? ●一對多:hasMany ●一對一:hasOne
PHP應用
????? ●返回結果:這兩個方法的返回結果都為yiidbActiveQuery對象(如果你想最后返回的是標準數組形式,記得加上asArray()參數)
PHP應用
????? ●第一個參數:所關聯的模型的類名稱.
PHP應用
????? ●第二個參數:是一個數組,其中鍵為所關聯的模型中的屬性,值為當前模型中的屬性.
PHP應用
關聯的使用
PHP應用
現在我們來嘗試獲取一個訂單PHP應用
//獲取訂單信息 $order = Order::findOne(1); //根據訂單信息獲取到用戶信息 $user = $order->user;
當然你可以選擇使用with方法,這樣看起來簡潔一些,其中with的參數為關系的名稱,也就在model里面定義的getUser中的user.PHP應用
//返回訂單信息(包括用戶信息) $order = Order::find(1)->with('user'); //或者 $order = Order::find(1)->getUser();
上面的代碼會生成并執行如下的sql語句PHP應用
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
從上面可以看出訪問一個關聯的時候有兩種方法PHP應用
?????? ●如果以函數的方式調用,會返回一個 ActiveQuery 對象($customer->getOrders()->all())PHP應用
?????? ●如果以屬性的方式調用,會直接返回模型的結果($customer->orders)
PHP應用
關聯結果緩存PHP應用
如果這時order表發生了改變,我們希望再次查詢的話PHP應用
$user = $order->user;
再次得到訂單的時候你會發現沒有變化.原因是只會在第一次執行$order->user的時候才會去數據庫里面查詢,然后會把結果緩存起來,以后查詢的時候都不會再執行sql.PHP應用
那么如果你想再次執行sql如何做呢?可以執行PHP應用
//先釋放緩存 unset($order->user); $order->user;
跨表查詢
PHP應用
下面重點來了!通過上面表結構的圖可以看到,User表和Order_goods表示沒有直接關聯的,那么如果我們想根據用戶信息查找這個用戶買了哪些商品的話,就勢必需要通過Order表去關聯兩張表.那么該怎么做呢?首先還是model層.因為我們是根據用戶去查,所以到User的model層去定義關聯.PHP應用
UserPHP應用
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.PHP應用
但是!我們還有最簡單的方法,那就是使用SQL語句啦!PHP應用
$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();
這樣基本就是整個關聯部分了PHP應用
總結PHP應用
以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對維易PHP的支持.PHP應用
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/456.html