Yii2框架使用AR進行多表聯合查詢時,使用hasmany()致使分頁數據不許

使用Yii2框架進行開發時,常常會遇到多表聯合查詢的場景,利用Yii自帶的AR類,能夠很方便的進行多表聯合查詢操做。
若是使用的是AR的話,在進行多表聯合查詢時,須要提早在相關的model層對相關的數據表模型進行hasOne()或hasMany()操做,即聲明關聯關係。
hasOne()或hasMany()的具體使用方法和實現原理,能夠在YII的官方網站的文檔中進行查詢,這裏只說一下hasOne()和hasMany()在使用過程當中常常會遇到的一個操做,分頁查詢,以及使用hasMany()時產生的一個數據問題,所查詢的數據不許確。具體用代碼舉例說明。mysql

1:假設有兩張表item(商品表),item_sku(商品sku表),它們的對應關係是 1:N,即一個商品能夠有多個對應的sku數據,那麼在item的model層聲明關聯類型時,大概以下:
public function getSku()
{
return $this->hasMany(ItemSku::className(), ['item_id' => 'id']);
}sql

2:咱們在item的controller層進行api編寫時,通常分頁查詢以下:
$result = Item::find()->joinwith('sku')->offset(0)->limit(10)->all();數據庫

3:此時若是咱們對$result進行 count()計算,假設mysql數據庫中的item數據>50條,但每每得出的結果可能只是7或者5,8之類的數據,而不是咱們想要的10條數據。api

網上查了不少資料,比較靠譜的解釋是,由於是1對多的關係,記錄總數是子表的記錄數(即ItemSku表),而子表的數據會有重複數據,進而致使數據不許。解決的方法也很簡單,即在查詢語句中加上distinct(),即
$result = Item::find()->joinwith('sku')->offset(0)->limit(10)->distinct()->all();
這樣,由於記錄數據去重後,即獲得了所需的數據。框架

相關文章
相關標籤/搜索