• 技术文章 >后端开发 >php教程

    详解YII2多表关联的使用

    *文*文2018-01-03 14:37:57原创606
    最近项目中遇到了YII2多表关联的相关问题,并没有找到合适的资料,于是自己整理了下,方便自己在以后需要的时候或者有需要的朋友们参考学习。本文主要给大家介绍了关于YII2中多表关联的使用方法,需要的朋友下面来一起看看吧。希望对大家有所帮助。

    前言

    本文对 YII2.0 的多表关联查询做一个简单的介绍。文中通过实例代码介绍的非常详细,下面话不多说,来一起看看详细的介绍:

    首先先来说明一下表结构

    表结构

    现在有订单表、用户表、商品清单表、商品库存表

    在YII中,如果想直接关联其他表进行查询的话,需要先在模型里定义它们的关联

    Order

    class Order extends \yii\db\ActiveRecord.{
     
         // 关联函数以get+要关联的数据表名来命名
         // 这是获取下订单的客户
         public function getUser(){
          
          // 第一个参数为要关联的子表模型类名,
          // 第二个参数指定 通过子表的user_id,关联主表的usesr_id字段
          // 这里写清楚点大概意思就是User.user_id => Order.user_id
         return $this->hasMany(User::className(), ['user_id' => 'user_id']);
         }
    }

    1、hasMany、hasOne使用

    Yii2中的表之间的关联有2种,它们用来指定两个模型之间的关联。

    ●一对多:hasMany ●一对一:hasOne

    ●返回结果:这两个方法的返回结果都为yiidbActiveQuery对象(如果你想最后返回的是标准数组形式,记得加上asArray()参数)

    ●第一个参数:所关联的模型的类名称。

    ●第二个参数:是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。

    关联的使用

    现在我们来尝试获取一个订单

    //获取订单信息
    $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 * FROM order WHERE id=1;
    SELECT * FROM user  WHERE user.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表去关联两张表。那么该怎么做呢?首先还是model层。因为我们是根据用户去查,所以到User的model层去定义关联。

    User

    public function getOrder() {
     return $this->hasMany(Order::className(), ['user_id' => 'user_id']);
    }
     
    public function getOrderGoods() {
     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 = 'select
      user.name,
      order.id,
      order_goods.goods_id,
      goods.goods_name,
      stock.stock_count
      from user
      LEFT JOIN order   ON order.user_id = user.user_id
      LEFT JOIN order_goods ON order_goods.order_id = order.order_id
      LEFT JOIN goods   ON goods.goods_id = order_goods.goods_id
      LEFT JOIN stock   ON stock.goods_id = goods.goods_id';
    $list1 = Article::findBySql($map)->asArray()->all();

    这样基本就是整个关联部分了

    相关推荐:

    详解Yii框架批量插入数据的简单扩展类

    详解yii2之restful api授权验证

    Yii解决DeleteAll连表删除报错问题

    以上就是详解YII2多表关联的使用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:YII2 使用 关联
    上一篇:详解PHP如何把数据库导出到csv文件的方法 下一篇:Laravel项目速度优化的浅析

    相关文章推荐

    • 对PHP排序稳定性问题的深思!• 解析PHP闭包及Clourse类方法的作用• 应用PHP标签模板实现什么任务_PHP教程• 几个php应用技巧_PHP教程• 用PHP产生动态的影像图_PHP教程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网