首页 > yii2教程 > yii2数据库使用

yii2数据表模型类AR--关联数据查询

查询关联的数据

使用 AR 方法也可以查询数据表的关联数据(如,选出表A的数据可以拉出表B的关联数据)。 有了 AR, 返回的关联数据连接就像连接关联主表的 AR 对象的属性一样。

建立关联关系后,通过 $customer->orders 可以获取 一个 Order 对象的数组,该数组代表当前客户对象的订单集。

定义关联关系使用一个可以返回 yii\db\ActiveQuery 对象的 getter 方法, yii\db\ActiveQuery对象有关联上下文的相关信息,因此可以只查询关联数据。如:

class Customer extends \yii\db\ActiveRecord
{
public function getOrders()
{
// 客户和订单通过 Order.customer_id -> id 关联建立一对多关系
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}

class Order extends \yii\db\ActiveRecord
{
// 订单和客户通过 Customer.id -> customer_id 关联建立一对一关系
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
}
}

以上使用了 yii\db\ActiveRecord::hasMany() 和 yii\db\ActiveRecord::hasOne() 方法。 以上两例分别是关联数据多对一关系和一对一关系的建模范例。 如,一个客户有很多订单,一个订单只归属一个客户。 两个方法都有两个参数并返回 yii\db\ActiveQuery 对象。

 

$class:关联模型类名,它必须是一个完全合格的类名。

$link: 两个表的关联列,应为键值对数组的形式。 数组的键是 $class 关联表的列名, 而数组值是关联类 $class 的列名。 基于表外键定义关联关系是最佳方法。

建立关联关系后,获取关联数据和获取组件属性一样简单, 执行以下相应getter方法即可:

// 取得客户的订单

// 取得客户的订单
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders 是 Order 对象数组

以上代码实际执行了以下两条 SQL 语句:

SELECT * FROM customer WHERE id=1;

SELECT * FROM order WHERE customer_id=1;

Tip: 再次用表达式 $customer->orders将不会执行第二次 SQL 查询, SQL 查询只在该表达式第一次使用时执行。 数据库访问只返回缓存在内部前一次取回的结果集,如果你想查询新的 关联数据,先要注销现有结果集:unset($customer->orders);。

有时候需要在关联查询中传递参数,如不需要返回客户全部订单, 只需要返回购买金额超过设定值的大订单, 通过以下getter方法声明一个关联数据 bigOrders :

class Customer extends \yii\db\ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
}

hasMany() 返回 yii\db\ActiveQuery 对象,该对象允许你通过 yii\db\ActiveQuery 方法定制查询。

如上声明后,执行 $customer->bigOrders 就返回 总额大于100的订单。使用以下代码更改设定值:

$orders = $customer->getBigOrders(200)->all();

Note: 关联查询返回的是 yii\db\ActiveQuery 的实例,如果像特性(如类属性)那样连接关联数据, 返回的结果是关联查询的结果,即 yii\db\ActiveRecord 的实例, 或者是数组,或者是 null ,取决于关联关系的多样性。如,$customer->getOrders() 返回 ActiveQuery 实例,而 $customer->orders 返回Order 对象数组 (如果查询结果为空则返回空数组)。

 

 美景欣赏

美景欣赏

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。