首先我们来解释下表结构。YII中的表结构现在包括订单表、用户表、商品清单表、商品库存表。如果想直接关联其他表进行查询,需要先在模型中定义它们的关联OrderclassOrderextends\yii\db\ActiveRecord.{//关联函数命名为get+要获取的数据表名associated//这里是获取下单的客户publicfunctiongetUser(){//第一个参数是要关联的子表模型的类名,//第二个参数指定子表的user_id-table,以及关联主表的usersr_id字段//这里写清楚,大致意思是User.user_id=>Order.user_idreturn$this->hasMany(User::className(),['user_id'=>'user_id']);}}hasMany和hasOne在Yii2中使用了两种表之间的关联,它们用于指定两个模型之间的连接。●一对多:hasMany●一对一:hasOne●返回结果:这两个方法的返回结果都是yiidbActiveQuery对象(如果想最后返回标准数组,记得加上asArray()参数)●第一个参数:关联模型的类名。●第二个参数:数组,key为关联模型中的属性,value为当前模型中的属性。关联使用下面我们来尝试获取订单//获取订单信息$order=Order::findOne(1);//根据订单信息获取用户信息$user=$order->user;当然你可以选择使用with方法,看起来简洁,其中with的参数是关系的名字,就是model中定义的getUser中的user//返回订单信息(包括用户信息)$order=Order::find(1)->with('user');//或$order=Order::find(1)->getUser();以上代码会生成并执行如下sql语句SELECT*FROMorderWHEREid=1;SELECT*FROMuserWHEREuser.user_id=order.user_id;从上面可以看出,访问关联有两种方式●如果作为函数调用,返回一个ActiveQuery对象($customer->getOrders()->all())●如果调用以属性的形式,直接返回模型的结果($customer->orders)和关联的结果缓存。如果此时order表发生了变化,我们要重新查询$user=$order->user;再次获得订购时您会发现没有任何变化。原因是第一次执行$order->user时只会查询数据库,然后缓存结果,后面查询时不会再执行sql。那么再想执行sql怎么办呢?可以先执行//释放缓存unset($order->user);$order->user;跨表查询下面重点来了!从上面的表结构图可以看出,User表和Order_goods没有直接关联,所以如果我们想根据用户信息找出用户购买了哪些产品,就必须用Order表来关联两张表。那么该怎么办?首先是模型层。因为我们是按照用户来搜索的,所以我们去到User的model层去定义关联。用户publicfunctiongetOrder(){return$this->hasMany(Order::className(),['user_id'=>'user_id']);}publicfunctiongetOrderGoods(){return$this->hasMany(OrderGoods::className(),['order_id'=>'order_id'])->via('order');}这里注意:getOrderGoods中的第二个order_id是指getOrder关联的Order中的order_id,第一个order_id是指OrderGoods中的order_id。但!我们还有最简单的方法,那就是使用SQL语句!$map='从用户中选择user.name,order.id,order_goods.goods_id,goods.goods_name,stock.stock_countgoodsONgoods.goods_id=order_goods.goods_idLEFTJOINstockONstock.goods_id=goods.goods_id';$list1=Article::findBySql($map)->asArray()->all();这基本上是整个相关部分
