摘要:第二個參數(shù)是一個數(shù)組,其中鍵為所關聯(lián)的模型中的屬性,值為當前模型中的屬性。這里注意中的第二個是指關聯(lián)的中的,第一個是指中的。
首先先來說明一下表結(jié)構(gòu)
表結(jié)構(gòu)
現(xiàn)在有訂單表、用戶表、商品清單表、商品庫存表
在YII中,如果想直接關聯(lián)其他表進行查詢的話,需要先在模型里定義它們的關聯(lián)
Order
class Order extends yiidbActiveRecord.{ // 關聯(lián)函數(shù)以get+要關聯(lián)的數(shù)據(jù)表名來命名 // 這是獲取下訂單的客戶 public function getUser(){ // 第一個參數(shù)為要關聯(lián)的子表模型類名, // 第二個參數(shù)指定 通過子表的user_id,關聯(lián)主表的usesr_id字段 // 這里寫清楚點大概意思就是User.user_id => Order.user_id return $this->hasMany(User::className(), ["user_id" => "user_id"]); } }
hasMany、hasOne使用
Yii2中的表之間的關聯(lián)有2種,它們用來指定兩個模型之間的關聯(lián)。
關聯(lián)的使用●一對多:hasMany ●一對一:hasOne
●返回結(jié)果:這兩個方法的返回結(jié)果都為yiidbActiveQuery對象(如果你想最后返回的是標準數(shù)組形式,記得加上asArray()參數(shù))
●第一個參數(shù):所關聯(lián)的模型的類名稱。
●第二個參數(shù):是一個數(shù)組,其中鍵為所關聯(lián)的模型中的屬性,值為當前模型中的屬性。
現(xiàn)在我們來嘗試獲取一個訂單
//獲取訂單信息 $order = Order::findOne(1); //根據(jù)訂單信息獲取到用戶信息 $user = $order->user;
當然你可以選擇使用with方法,這樣看起來簡潔一些,其中with的參數(shù)為關系的名稱,也就在model里面定義的getUser中的user.
//返回訂單信息(包括用戶信息) $order = Order::find(1)->with("user"); //或者 $order = Order::find(1)->getUser();
上面的代碼會生成并執(zhí)行如下的sql語句
SELECT * FROM order WHERE id=1; SELECT * FROM user WHERE user.user_id=order.user_id;
從上面可以看出訪問一個關聯(lián)的時候有兩種方法
●如果以函數(shù)的方式調(diào)用,會返回一個 ActiveQuery 對象($customer->getOrders()->all())
●如果以屬性的方式調(diào)用,會直接返回模型的結(jié)果($customer->orders)
關聯(lián)結(jié)果緩存
如果這時order表發(fā)生了改變,我們希望再次查詢的話
$user = $order->user;
再次得到訂單的時候你會發(fā)現(xiàn)沒有變化。原因是只會在第一次執(zhí)行$order->user的時候才會去數(shù)據(jù)庫里面查詢,然后會把結(jié)果緩存起來,以后查詢的時候都不會再執(zhí)行sql。
那么如果你想再次執(zhí)行sql如何做呢?可以執(zhí)行
//先釋放緩存 unset($order->user); $order->user;跨表查詢
下面重點來了!通過上面表結(jié)構(gòu)的圖可以看到,User表和Order_goods表示沒有直接關聯(lián)的,那么如果我們想根據(jù)用戶信息查找這個用戶買了哪些商品的話,就勢必需要通過Order表去關聯(lián)兩張表。那么該怎么做呢?首先還是model層。因為我們是根據(jù)用戶去查,所以到User的model層去定義關聯(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中的第二個order_id是指getOrder關聯(lián)的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();
這樣基本就是整個關聯(lián)部分了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23280.html
摘要:前言是特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關聯(lián)查詢出來...
摘要:前言是特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關聯(lián)查詢出來...
摘要:前言是特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯(lián)查詢的函數(shù),平時在使用多表關聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關聯(lián)查詢出來...
摘要:今天把這個問題講明白了,看看是怎么個多表關聯(lián)以及如何去優(yōu)化這個關聯(lián)。現(xiàn)需要在列表展示表的來源渠道,且該渠道可搜索。關聯(lián)表字段增加查詢中的搜索模型也是通過實現(xiàn)的,該模型通過控制著哪個字段可搜索,哪個字段不可搜索。 作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留...
閱讀 1297·2021-11-04 16:09
閱讀 3484·2021-10-19 11:45
閱讀 2396·2021-10-11 10:59
閱讀 1010·2021-09-23 11:21
閱讀 2762·2021-09-22 10:54
閱讀 1129·2019-08-30 15:53
閱讀 2600·2019-08-30 15:53
閱讀 3477·2019-08-30 12:57