Yii2聯合查詢(配合GridView)

weixin_34006468發表於2016-11-14

最近在使用Yii2來做網站,感觸比較深的是雖然感覺自己看文件看得七七八八,看上去貌似也好像懂的基本用法,但真正的困難還是在於如何應用到自己的實際開發當中。
今天在做網站的後臺管理,碰巧需要多表查詢,可能自己理解力比較差,折騰了很久才懂得怎麼使用,在這裡記錄一下。
下面我們是使用AR模型來實現多表查詢:
<a>1、第一步我們先建立AR模型,分別為Customer(對應customer使用者表)以及Order(對應order訂單表,它與customer表為多對一關係)</a>
<code>
class Customer extends \yii\db\ActiveRecord{
//這裡返回訂單中金額大於100的訂單
public function getBigOrders($threshold = 100) {
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
}
class Order extends \yii\db\ActiveRecord{
// 訂單和客戶通過 Customer.id -> customer_id 關聯建立一對一關係
public function getCustomer() {
return $this->hasOne(Customer::className(), ['id' =>'customer_id']); }}
</code>
<a>2、查詢擁有金額大於100的訂單的所有使用者並用gridview顯示</a>
在控制器<code>SiteController.php</code>中
<code>
namespace app\models\controller;
use yii\data\ActiveDataProvider;
class SiteController extend Controller {
public function actionGetorders {
$dataProvider = new ActiveDataProvider([
'query' => Customer::find()->innerJoinWith('bigorders')//如果還需要關聯到第三個表則可使用with('books')
'pagination' => [
'pageSize' => 10,//每頁10條
],
]);
return $this->render('index',['dataProvider' => $dataProvider]);
}
}
</code>
<strong>在這裡需要注意下的是:
1)分頁器Pagination以及資料提供器ActiveDataProvider都僅支援yii\db\ActiveQuery物件而非陣列形式,所以後面加上了all()方法或者是使用了Yii::$app->db->createCommand()方法是會報錯的;
2)此外,如果是使用了Order::findeBySql()來執行查詢也是出現錯誤的;
</strong>
<a>3、在view資料夾的index.php中顯示資料</a>
<code>use yii\grid\GridView;
<?php
echo GridView::widget([
'dataProvider' => $dataProvider,
]);

相關文章