亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Yii2 ActiveRecord多表關聯及多表關聯搜索的實現

2024-05-04 23:47:32
字體:
來源:轉載
供稿:網友

Yii的ActiveRecord是與數據庫打交道的類,也即MVC中的M(模型層),也是ORM的O(Object)。

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

場景需求:

假設我們有一張用戶表user和一張用戶渠道表auth,兩張數據表通過user.id和auth.uid進行一對一關聯。現需要在user列表展示auth表的來源渠道source,且該渠道可搜索。

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

我看繼續看重要的幾個操作步驟:

1、找到user表對應的AR模型類 common/models/User.php,在該類文件中進行關聯auth表

/*** 關聯auth表*/public function getAuth(){// hasOne要求返回兩個參數 第一個參數是關聯表的類名 第二個參數是兩張表的關聯關系 // 這里uid是auth表關聯id, 關聯user表的uid id是當前模型的主鍵idreturn $this->hasOne(common/models/Auth::className(), ['uid' => 'id']);}

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

2、在gridview中添加關聯表的來源渠道字段source

<?= GridView::widget([// other codes'columns' => [// other columns'auth.source',]]); ?>

有同學感覺疑問了,上面不是說了沒進行關聯嗎,這個怎么可以直接使用auth.source?

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

我們會發現有很多類似 select * from `auth` where uid = xxx;之類的操作,如果你的分頁默認20條數據時,會有20個類似的query。

我們先搞明白發生了什么?

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

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

3、優化sql

我們需要優化的是:

20條sql變1條sql

只獲取關聯表需要的字段

有同學要嚷嚷了,這里是yii自帶的操作,怎么優化?我們回到數據源的獲取上,發現user列表的數據是通過userSearch model的search方法提供的。

也就是說我們的數據查詢實際上就沒有去進行關聯表查詢!既然如此,我們就在UserSearch加上關聯查詢

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

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

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

也就是說我么已經達到了優化sql的目的,通過debug分析發現,DB的查詢時間少了很多。

4、關聯表字段增加查詢

gridview中的搜索模型也是通過searchModel實現的,該模型通過rules控制著哪個字段可搜索,哪個字段不可搜索。

我們現在需要增加關聯表的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的,要實現程序上的搜索還差一步,我們在數據源獲取的地方加上新增的source條件即可

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

下面給大家補充yii中ActiveRecord的一些用法

1,對象轉數組

$model = new ActiveRecord();
$model.toArray();

由于ActiveRecord不是簡單數組,不能直接json_encode,否則信息不完整。

解決辦法:$model.toArray();這樣就變為簡單數組了,可以進行json_encode了。

2,通過名字或其他字段直接獲取ActiveRecord的id。

$nIdcId = idc_info::model()->find('name like :name',array(':name'=>"%".$strIdcName."%"))->id; 

我以前經常使用的辦法是(現在發現很土):

$idc = Idc::model()->find("..."); $id = $idc->id; 

3,對model的理解

$accModel = call_user_func(array(ActiveRecordName, 'model')); $model  = $accModel->findByPk($id); 

以上所述是小編給大家介紹的Yii2 ActiveRecord多表關聯及多表關聯搜索的實現的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕网| 亚洲free性xxxx护士hd| 日韩av免费网站| 8x海外华人永久免费日韩内陆视频| 亚洲va男人天堂| 亚洲欧美在线免费观看| 国产欧美日韩免费看aⅴ视频| 亚洲国产精品久久久久秋霞蜜臀| 久久久伊人欧美| 亚洲自拍偷拍一区| 欧美日韩国产色视频| 亚洲综合av影视| 国自在线精品视频| 91sao在线观看国产| 国产精品狠色婷| 欧美丝袜美女中出在线| 色偷偷av一区二区三区| 欧美午夜视频一区二区| 中文字幕欧美日韩| 成人午夜小视频| 人九九综合九九宗合| 国产99久久精品一区二区永久免费| 日韩成人激情影院| 久久久精品在线| 亚洲第一页中文字幕| 亚洲缚视频在线观看| 日本一区二区在线播放| 91av福利视频| 91精品中文在线| 日韩中文娱乐网| 亚洲无亚洲人成网站77777| 欧美亚洲激情在线| 91久久夜色精品国产网站| 日韩精品在线观看网站| 精品国产一区二区三区久久久狼| 成人黄色影片在线| 久久免费观看视频| 日韩中文娱乐网| 日韩精品一二三四区| 久久青草精品视频免费观看| 中文字幕亚洲一区二区三区| 在线观看欧美视频| 国产热re99久久6国产精品| 亚洲电影免费在线观看| 欧美日韩国内自拍| 97人洗澡人人免费公开视频碰碰碰| 91九色综合久久| 8090理伦午夜在线电影| 成人激情视频小说免费下载| 欧美激情精品久久久久| 国产主播喷水一区二区| 久久久亚洲影院你懂的| 性欧美xxxx| 九九热精品在线| 亚洲成人精品av| 亚洲欧美日韩一区二区三区在线| 懂色aⅴ精品一区二区三区蜜月| 亚洲在线一区二区| 中文字幕精品www乱入免费视频| 日韩av手机在线| 亚洲成人精品久久久| 亚洲欧美成人在线| 欧美黑人巨大精品一区二区| 国产视频亚洲精品| 夜夜嗨av色一区二区不卡| 国产亚洲精品高潮| 日韩电影中文 亚洲精品乱码| 97超碰蝌蚪网人人做人人爽| 在线看片第一页欧美| 日韩亚洲精品视频| 中文字幕精品影院| 国模视频一区二区| 亚洲欧美另类人妖| 成人在线视频网| 一本一道久久a久久精品逆3p| 久久偷看各类女兵18女厕嘘嘘| 亚洲天堂视频在线观看| 亚洲美女精品成人在线视频| 亚洲欧洲日产国产网站| 国产精品露脸自拍| 欧美日韩国产激情| 欧美高清视频在线观看| 97视频在线观看视频免费视频| 最近更新的2019中文字幕| 精品动漫一区二区三区| 毛片精品免费在线观看| 亚洲97在线观看| 日韩最新中文字幕电影免费看| 亚洲成人精品在线| 亚洲福利在线播放| 92版电视剧仙鹤神针在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲欧美中文在线视频| 色婷婷综合久久久久中文字幕1| 亚洲白虎美女被爆操| 亚洲欧美国产一本综合首页| 亚洲欧美制服另类日韩| 中文字幕欧美日韩在线| 亚洲激情电影中文字幕| 成人信息集中地欧美| www.欧美三级电影.com| 欧美成人在线影院| 美日韩精品免费视频| 精品毛片三在线观看| 日韩性xxxx爱| 国产精品一区二区久久国产| 欧美成人sm免费视频| 欧美野外wwwxxx| 91国语精品自产拍在线观看性色| 国产精品久久久久9999| 97久久超碰福利国产精品…| 日韩电影网在线| 欧美日韩在线看| 日本一欧美一欧美一亚洲视频| 中文字幕视频一区二区在线有码| 2018日韩中文字幕| 久久久www成人免费精品张筱雨| 欧洲成人在线观看| 色综合色综合久久综合频道88| 欧美日韩第一页| 日韩中文字幕在线视频| 最近2019年好看中文字幕视频| 日本精品中文字幕| 久久久久久91香蕉国产| 欧美国产第二页| 日韩在线中文字幕| 久久精品国产免费观看| 国产精品高潮呻吟久久av无限| 亚洲xxx自由成熟| 国产一区二区三区在线观看网站| 国产一区二区在线免费视频| 日韩精品一区二区三区第95| 一本色道久久综合狠狠躁篇的优点| 日韩国产中文字幕| 国产香蕉精品视频一区二区三区| 91精品国产综合久久香蕉最新版| 久久手机精品视频| 日韩欧美中文在线| 亚洲一区二区免费在线| 国产成人精品在线| 欧美日韩在线免费| 57pao成人国产永久免费| 中文字幕欧美专区| 精品无码久久久久久国产| 国产精品v日韩精品| 国产视频精品一区二区三区| 国产亚洲视频在线| 亚洲三级av在线| 亚洲成成品网站| 国产成人福利夜色影视| 亚洲第一福利在线观看| 一区二区三区 在线观看视| 亚洲free性xxxx护士白浆| 日本19禁啪啪免费观看www| 欧美激情中文字幕在线| 国产精品揄拍一区二区| 国产精品美女免费| 国产精品极品美女粉嫩高清在线| 国产欧美日韩91| 亚洲色图13p| 亚洲自拍偷拍色片视频| 国产成人综合精品| 亚洲欧洲日产国码av系列天堂| 欧美电影在线观看完整版|