序
本文简要介绍了YII2.0中的多表关联查询,并详细介绍了示例代码。下面就不多说了。我们来看看详细的介绍:
首先,让我们解释一下表的结构
表结构
现在有订单表、用户表、商品清单表和商品库存表
在YII,如果您想直接查询其他表,您需要首先在模型中定义它们的关联
命令
类顺序扩展 yii db activerecord。{//关联函数以要与get关联的数据表名命名。//这是获取订单的客户公共函数getuser()。{//第一个参数是要关联的子表模型类名。//第二个参数通过子表的user_id指定主表的usesr_id字段。//这里的明确点大致是指用户。用户标识=订单。user _ ID return $ this-有很多(user33603360类名(),['user _ ID'=' user _ ID']) }}1。有许多和一个用途
Yii2中的表之间有两种关联,用于指定两个模型之间的关联。
一对多:有多个一对一:有一个
返回结果:这两种方法的返回结果都是yiidbActiveQuery对象(如果最后想返回标准数组形式,记得添加asArray()参数)
第一个参数:关联模型的类名。
第二个参数是数组,其中键是关联模型中的属性,值是当前模型中的属性。
关联的使用
现在让我们试着去订购
//获取订单信息$ order=order : find one(1);//获取用户信息$ user=$ order-用户根据订单信息;当然,您可以选择使用with方法,这看起来更简单,其中with的参数是关系的名称,这也是模型中定义的getUser中的用户。
//返回订单信息(包括用户信息)$ order=order :3360 find(1)-带(' user ');//或$ order=order : find(1)-getuser();上面的代码将生成并执行以下sql语句
SELECT * FROM订单,其中id=1;SELECT * FROM user WHERE user . user _ id=order . user _ id;从上面可以看出,有两种方法可以访问关联
如果作为函数调用,它将返回一个ActiveQuery对象($customer-getOrders()-all())
如果作为属性调用,将直接返回模型的结果($customer-orders)
关联结果缓存
如果此时订单表发生变化,我们想再次查询它,
$ user=$ order-user;当你再次拿到订单时,你会发现没有变化。原因是只有在第一次执行$order-user的时候才会查询数据库,然后缓存结果,在以后的查询中不会执行sql。
那么如果你想再次执行sql呢?可以执行
//首先释放缓存unset($ order-user);$ order-user;跨表查询
关键点来了!从上面的表结构可以看出,User表与Order_goods表示没有直接关系,所以如果我们想根据用户信息找出用户购买了什么商品,就必须使用Order表来关联这两个表。那我们该怎么办?首先是模型层。因为我们根据用户查找,所以我们去用户的模型层定义关联。
用户
public function getOrder(){ return $ this-has multi(order : class name(),[' user _ id '=' user _ id ']);} public function getOrderGoods(){ return $ this-hasMany(ordergoods :3360 class name(),[' order _ id '=' order _ id '])-via(' order ');}这里注意:getOrderGoods中的第二个Order_id指的是与getOrder关联的订单中的order_id,第一个order_id指的是OrderGoods中的order_id。
但是!我们还有最简单的方法,那就是使用SQL语句!
$map='从用户中选择user.name,order.id,order_goods.goods_id,goods.goods_name,stock。stock _ count LEft JOIN order ON order。user _ id=用户。user _ id LEft JOIN order _ goods ON order _ goods。order _ id=order。order _ id LEft JOIN goods ON goods。商品_ id=订单_商品。商品_ id=订单_商品。' goods _ id ';$ list 1=article :3360 findbyql($ map)-asar ray()-all();这样基本就是整个关联部分了
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。