成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

YII2中多表關(guān)聯(lián)的使用

vslam / 898人閱讀

摘要:第二個(gè)參數(shù)是一個(gè)數(shù)組,其中鍵為所關(guān)聯(lián)的模型中的屬性,值為當(dāng)前模型中的屬性。這里注意中的第二個(gè)是指關(guān)聯(lián)的中的,第一個(gè)是指中的。

首先先來說明一下表結(jié)構(gòu)

表結(jié)構(gòu)

現(xiàn)在有訂單表、用戶表、商品清單表、商品庫存表

在YII中,如果想直接關(guān)聯(lián)其他表進(jìn)行查詢的話,需要先在模型里定義它們的關(guān)聯(lián)

Order

class Order extends yiidbActiveRecord.{
    
    // 關(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"]);
    }
}

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方法,這樣看起來簡潔一些,其中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。

但是!我們還有最簡單的方法,那就是使用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)部分了

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23280.html

相關(guān)文章

  • Yii2中hasOne、hasMany以及多對(duì)多關(guān)聯(lián)查詢用法

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...

    qc1iu 評(píng)論0 收藏0
  • Yii2中hasOne、hasMany以及多對(duì)多關(guān)聯(lián)查詢用法

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...

    lmxdawn 評(píng)論0 收藏0
  • Yii2中hasOne、hasMany以及多對(duì)多關(guān)聯(lián)查詢用法

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...

    BDEEFE 評(píng)論0 收藏0
  • yii2 ActiveRecord多表關(guān)聯(lián)以及多表關(guān)聯(lián)搜索實(shí)現(xiàn)

    摘要:今天把這個(gè)問題講明白了,看看是怎么個(gè)多表關(guān)聯(lián)以及如何去優(yōu)化這個(gè)關(guān)聯(lián)?,F(xiàn)需要在列表展示表的來源渠道,且該渠道可搜索。關(guān)聯(lián)表字段增加查詢中的搜索模型也是通過實(shí)現(xiàn)的,該模型通過控制著哪個(gè)字段可搜索,哪個(gè)字段不可搜索。 作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留...

    venmos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<