亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Yii2中如何實現ActiveRecord多表關聯及多表關聯搜索

發布時間:2021-08-27 09:50:17 來源:億速云 閱讀:148 作者:小新 欄目:開發技術

這篇文章主要介紹Yii2中如何實現ActiveRecord多表關聯及多表關聯搜索,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

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是當前模型的主鍵id
return $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 20
SELECT * 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多表關聯及多表關聯搜索”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克陶县| 抚顺县| 唐山市| 顺昌县| 苏州市| 河北区| 淮阳县| 平遥县| 思南县| 若尔盖县| 吴江市| 蓬安县| 邯郸市| 绵阳市| 彰化市| 滨海县| 齐齐哈尔市| 拜城县| 克什克腾旗| 靖西县| 临泽县| 府谷县| 师宗县| 甘谷县| 册亨县| 定结县| 莒南县| 嘉祥县| 安陆市| 南京市| 酒泉市| 海南省| 岢岚县| 乌恰县| 巴林左旗| 万年县| 黔东| 惠水县| 扎兰屯市| 田东县| 洛浦县|