最近在使用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,
]);
Yii2联合查询(配合GridView)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 我们用实例来说明这一部分 表结构 现在有客户表、订单表、图书表、作者表, 客户表Customer(idcustom...
- 执行 SQL 查询 一旦拥有了 DB Connection 实例, 可以按照下列步骤来执行 SQL 查询: 使用纯...