2016-03-14 47 views
1

我有兩個表:電話,手機Yii2轉換的SqlDataProvider到ActiveDataProvider與左連接

有兩種型號:通話,語音通話

和下面的代碼:

$q = 'select 
     c.calling, sp.name as srcname, sp.org as srcorg, 
     c.called, dp.name as dstname, dp.org as dstorg 
     from Calls c 
     left join Phones sp on c.calling = sp.num 
     left join Phones dp on c.called = dp.num ORDER BY c.time ' 
$sql = Yii:$app->db->createCommand($q) 
$count = $sql->queryScalar(); 
$dataProvider = new SqlDataProvider([ 
    'sql' => $q, 
    'pagination' => [ 
     'pageSize' => 25, 
    ], 
    'totalCount' => $count, 
]); 

如何將其轉換到ActiveDataProvider查詢?

$dataProvder = new ActiveDataProvider([ 
'query' => Call::find()->..., 
'pagination' => [ 
     'pageSize' => 25, 
    ], 
]); 

回答

1

我有幾個輸入給你,這也將回答你的問題。

模型,而不是原始查詢

使用Gii爲您的兩個表創建模型。該擴展是內置的,您可以在調試模式下通過調用http://yourproject.com/gii來打開它。

當你創建模型時,它也將建立你的關係到另一個表。您可以根據Yii2的model-documentationActiveRecord-documentation輕鬆進行自定義。後面還會告訴你如何指定關係here

在你的情況Call -model將有兩個hasOne -relations:

  • sourcePhone引用到手機的型號發起呼叫
  • destinationPhone引用到接收手機型號

數據提供者和網格視圖列出呼叫

現在開始很容易。比方說,你要列出所有呼叫,您可以按如下做到這一點:

<?= GridView::widget([ 
    'dataProvider'=>new ActiveDataProvider(['query'=>Call::find()]), 
    'columns'=>[ 
     'id', 
     [ 
      'label'=>Yii::t('app', 'Source phone'), 
      'value'=>function ($model, $key, $index, $column) { 
       return $model->sourcePhone->name; 
      }, 
     ], 
     [ 
      'label'=>Yii::t('app', 'Destination phone'), 
      'value'=>function ($model, $key, $index, $column) { 
       return $model->destinationPhone->name; 
      }, 
     ], 
     //more columns as of your requirements... 
    ], 
]) ?> 

你不僅使用ActiveDataProvider現在,你還可以使用Yii2的共同的方式來顯示這樣的數據(關係等)。分頁和東西可以在數據提供者上以與上述相同的方式定製。

如何使用join -part與ActiveQuery

這一個是容易的。調用關係(延遲加載)後,表格的實際連接將自動發生。在上面的例子中,這將發生在這裏:

return $model->destinationPhone->name 

這導致另一個查詢填充與相應的電話實例的關係。如果你想這與實際的來電查詢一起發生的,只是延長您提供給您的ActiveDataProvdier查詢:

'dataProvider'=>new ActiveDataProvider([ 
    'query'=>Call::find()->joinWith(['sourcePhone', 'destinationPhone']), 
]), 

joinWith - 方法告訴查詢到與兩個關係共同獲取通話對象你在參數中指定。確保你閱讀documentation of this method。我還寫了一個answer to a problem I had myself,它進一步解釋它。

如果您想要訪問相關對象的列,只需訪問相關對象,如調用對象的屬性,然後訪問屬性本身。在我上面的示例中,您可以看到我如何訪問相關手機型號的屬性name

如果您需要關於某些零件的更多信息,告訴我。

+0

感謝您的詳細解答!我的問題是如何使用 - > join()或 - > leftJoin()在ActiveDataProvider上進行「連接」查詢? – epema

+0

以及如何輸出從連接中獲得的列? – epema

+0

不客氣!我用你想要的信息擴展了我的答案。正如它在我看來,你應該真的閱讀Yii2的模型和ActiveRecord概念的文檔!我在我的答案的第一段中將兩者聯繫起來。我向你保證,你的所有問題都將隨之消失!否則,只需寫另一條評論:)! – PLM57