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

資訊專欄INFORMATION COLUMN

yii2 ActiveRecord多表關(guān)聯(lián)以及多表關(guān)聯(lián)搜索的實(shí)現(xiàn)

venmos / 2400人閱讀

摘要:今天把這個問題講明白了,看看是怎么個多表關(guān)聯(lián)以及如何去優(yōu)化這個關(guān)聯(lián)?,F(xiàn)需要在列表展示表的來源渠道,且該渠道可搜索。關(guān)聯(lián)表字段增加查詢中的搜索模型也是通過實(shí)現(xiàn)的,該模型通過控制著哪個字段可搜索,哪個字段不可搜索。

作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

一個老生常談的問題。最近通過群里的反饋,覺得很多人還是沒有去理解這個問題。今天把這個問題講明白了,看看yii2 ActiveRecord是怎么個多表關(guān)聯(lián)以及如何去優(yōu)化這個關(guān)聯(lián)。

場景需求:

假設(shè)我們有一張用戶表user和一張用戶渠道表auth,兩張數(shù)據(jù)表通過user.id和auth.uid進(jìn)行一對一關(guān)聯(lián)?,F(xiàn)需要在user列表展示auth表的來源渠道source,且該渠道可搜索。

首先我們先通過gii生成user和auth系列相關(guān)的model和操作。此處不做詳細(xì)說明,有關(guān)gii的操作可參考xxx

我看繼續(xù)看重要的幾個操作步驟:

1、找到user表對應(yīng)的AR模型類 commonmodelsUser.php,在該類文件中進(jìn)行關(guān)聯(lián)auth表

/**
 *  關(guān)聯(lián)auth表
 */
public function getAuth()
{
    // hasOne要求返回兩個參數(shù) 第一個參數(shù)是關(guān)聯(lián)表的類名 第二個參數(shù)是兩張表的關(guān)聯(lián)關(guān)系 
    // 這里uid是auth表關(guān)聯(lián)id, 關(guān)聯(lián)user表的uid id是當(dāng)前模型的主鍵id
    return $this->hasOne(commonmodelsAuth::className(), ["uid" => "id"]);
}

設(shè)置好了之后,并不代表兩張數(shù)據(jù)表自動進(jìn)行關(guān)聯(lián)了!我們訪問user列表頁(該列表頁采用gii生成,目前我們沒操作過),通過debug查看Database Queries不難發(fā)現(xiàn),實(shí)際中的query并沒有進(jìn)行關(guān)聯(lián)auth表

2、在gridview中添加關(guān)聯(lián)表的來源渠道字段source

 [
        // other columns
        "auth.source",
    ]
]); ?>

有同學(xué)感覺疑問了,上面不是說了沒進(jìn)行關(guān)聯(lián)嗎,這個怎么可以直接使用auth.source?

先別急,此時(shí)我們打開debug看看實(shí)際的query。

我們會發(fā)現(xiàn)有很多類似 select * from auth where uid = xxx;之類的操作,如果你的分頁默認(rèn)20條數(shù)據(jù)時(shí),會有20個類似的query。

我們先搞明白發(fā)生了什么?

實(shí)際上這屬于php的基礎(chǔ)知識了。讀取和寫入對象的一個不存在的成員變量時(shí), __get() __set() 魔術(shù)函數(shù)會被自動調(diào)用。yii也是利用了這一點(diǎn)對其進(jìn)行了實(shí)現(xiàn)!

該操作跟大部分人在gridview中封裝方法獲取關(guān)聯(lián)表數(shù)據(jù)幾乎一致,但是!20條sql的查詢明顯增加了眾多的開銷。如果這里是left join操作多好!

3、優(yōu)化sql

我們需要優(yōu)化的是:

20條sql變1條sql

只獲取關(guān)聯(lián)表需要的字段

有同學(xué)要嚷嚷了,這里是yii自帶的操作,怎么優(yōu)化?我們回到數(shù)據(jù)源的獲取上,發(fā)現(xiàn)user列表的數(shù)據(jù)是通過userSearch model的search方法提供的。

也就是說我們的數(shù)據(jù)查詢實(shí)際上就沒有去進(jìn)行關(guān)聯(lián)表查詢!既然如此,我們就在UserSearch加上關(guān)聯(lián)查詢

$query = User::find();
$query->joinWith(["auth"]);
$query->select("user.*, auth.source");

我們再來刷新下user列表頁,然后通過debug分析發(fā)現(xiàn)有兩條sql引起了我們的注意

SELECT `user`.*, `auth`.`source` FROM `user` LEFT JOIN `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20
SELECT * FROM `auth` WHERE `user_id` IN (20個uid);

也就是說我么已經(jīng)達(dá)到了優(yōu)化sql的目的,通過debug分析發(fā)現(xiàn),DB的查詢時(shí)間少了很多。

4、關(guān)聯(lián)表字段增加查詢

gridview中的搜索模型也是通過searchModel實(shí)現(xiàn)的,該模型通過rules控制著哪個字段可搜索,哪個字段不可搜索。

我們現(xiàn)在需要增加關(guān)聯(lián)表的source可搜索,因此我們在searchModel中定義一個屬性source且添加到rules中

public $source;
public function rules()
{
    return [
    // other rules
        ["source", "safe"],
    ];
}

接著我們把gridview中的auth.source修改一下

// "auth.source",
[
    "attribute" => "source",
    "value" => "auth.source",
    "label" => "渠道來源",
],

到這里我們界面上是ok的,要實(shí)現(xiàn)程序上的搜索還差一步,我們在數(shù)據(jù)源獲取的地方加上新增的source條件即可

$query->andFilterWhere([
    // other params
    "auth.source" => $this->source,
]);

[考慮目前國內(nèi)網(wǎng)站大部分采集文章十分頻繁,更有甚者不注明原文出處,原作者更希望看客們查看原文,以防有任何問題不能更新所有文章,避免誤導(dǎo)!]

查看原文

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

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

相關(guān)文章

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

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(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 評論0 收藏0
  • Yii2中hasOne、hasMany以及多對多關(guān)聯(lián)查詢用法

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(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 評論0 收藏0
  • Yii2中hasOne、hasMany以及多對多關(guān)聯(lián)查詢用法

    摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(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 評論0 收藏0
  • YII2多表關(guān)聯(lián)使用

    摘要:第二個參數(shù)是一個數(shù)組,其中鍵為所關(guān)聯(lián)的模型中的屬性,值為當(dāng)前模型中的屬性。這里注意中的第二個是指關(guān)聯(lián)的中的,第一個是指中的。 首先先來說明一下表結(jié)構(gòu) 表結(jié)構(gòu) 現(xiàn)在有訂單表、用戶表、商品清單表、商品庫存表 showImg(https://segmentfault.com/img/bVRcME?w=833&h=244); showImg(https://segmentfault.com/i...

    vslam 評論0 收藏0

發(fā)表評論

0條評論

venmos

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<