资讯专栏INFORMATION COLUMN

YII2中多表关联的使用

vslam / 892人阅读

摘要:第二个参数是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。这里注意中的第二个是指关联的中的,第一个是指中的。

首先先来说明一下表结构

表结构

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

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

Order

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

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();

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23280.html

相关文章

  • Yii2中hasOne、hasMany以及多对多关联查询用法

    摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询 前言 hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来...

    qc1iu 评论0 收藏0
  • Yii2中hasOne、hasMany以及多对多关联查询用法

    摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询 前言 hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来...

    lmxdawn 评论0 收藏0
  • Yii2中hasOne、hasMany以及多对多关联查询用法

    摘要:前言是特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。需求分析使用一条查询语句就能把列表的数据全部展现出来,列表包含一对一,一对多,以及多对多的关系。不能破坏自有的表头排序功能,以及中的存值。相关资料中多表关联查询 前言 hasOne、hasMany是Yii2特有的用于多表关联查询的函数,平时在使用多表关联查询的时候建议使用它们。为什么?因为这种方式关联查询出来...

    BDEEFE 评论0 收藏0
  • yii2 ActiveRecord多表关联以及多表关联搜索实现

    摘要:今天把这个问题讲明白了,看看是怎么个多表关联以及如何去优化这个关联。现需要在列表展示表的来源渠道,且该渠道可搜索。关联表字段增加查询中的搜索模型也是通过实现的,该模型通过控制着哪个字段可搜索,哪个字段不可搜索。 作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留...

    venmos 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<