多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
最近在使用Yii2来做网站,感触比较深的是虽然感觉自己看文档看得七七八八,看上去貌似也好像懂的基本用法,但真正的困难还是在于如何应用到自己的实际开发当中。 今天在做网站的后台管理,碰巧需要多表查询,可能自己理解力比较差,折腾了很久才懂得怎么使用,在这里记录一下。 下面我们是使用AR模型来实现多表查询: 1、第一步我们先创建AR模型,分别为Customer(对应customer用户表)以及Order(对应order订单表,它与customer表为多对一关系) 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']); }} 2、查询拥有金额大于100的订单的所有用户并用gridview显示 在控制器SiteController.php中 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]); } } 在这里需要注意下的是: 1)分页器Pagination以及数据提供器ActiveDataProvider都仅支持yii\db\ActiveQuery对象而非数组形式,所以后面加上了all()方法或者是使用了Yii::$app->db->createCommand()方法是会报错的; 2)此外,如果是使用了Order::findeBySql()来执行查询也是出现错误的; 3、在view文件夹的index.php中显示数据 use yii\grid\GridView; <?php echo GridView::widget([ 'dataProvider' => $dataProvider, ]);