ar 关联查询问题 [ 2.0 版本 ]
现有三个表,a表连接b表,b表连接c表。
现在在a模块里面怎么写c表的连接?添加hasOne?
最佳答案
-
我也做一回搬运工吧~
中间关联表(Relations via a Junction Table)
在数据库建模中,当两个关联表之间的对应关系是多对多时, 通常会引入一个连接表。例如,order 表 和 item 表可以通过名为 order_item 的连接表相关联。一个 order 将关联多个 order items, 而一个 order item 也会关联到多个 orders。当声明这种表关联后,您可以调用 via() 或 viaTable() 指明连接表。via() 和 viaTable() 之间的区别是 前者是根据现有的关联名称来指定连接表,而后者直接使用 连接表。例如,
class Order extends ActiveRecord { public function getItems() { return $this->hasMany(Item::className(), ['id' => 'item_id']) ->viaTable('order_item', ['order_id' => 'id']); } }
或者,
class Order extends ActiveRecord { public function getOrderItems() { return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); } public function getItems() { return $this->hasMany(Item::className(), ['id' => 'item_id']) ->via('orderItems'); } }
使用连接表声明的关联和正常声明的关联是等同的,例如,
// SELECT * FROM `order` WHERE `id` = 100 $order = Order::findOne(100); // SELECT * FROM `order_item` WHERE `order_id` = 100 // SELECT * FROM `item` WHERE `item_id` IN (...) // 返回 Item 类组成的数组 $items = $order->items;
通过多个表来连接关联声明(Chaining relation definitions via multiple tables)
通过使用 via() 方法,它还可以通过多个表来定义关联声明。 再考虑考虑上面的例子,我们有 Customer, Order, 和 Item 类。 我们可以添加一个关联关系到 Customer 类,这个关联可以列出了 Customer(客户) 的订单下放置的所有 Item(商品), 这个关联命名为 getPurchasedItems(),关联声明如下代码示例所示:class Customer extends ActiveRecord { // ... public function getPurchasedItems() { // 客户的商品,将 Item 中的 'id' 列与 OrderItem 中的 'item_id' 相匹配 return $this->hasMany(Item::className(), ['id' => 'item_id']) ->via('orderItems'); } public function getOrderItems() { // 客户订单中的商品,将 `Order` 的 'id' 列和 OrderItem 的 'order_id' 列相匹配 return $this->hasMany(OrderItem::className(), ['order_id' => 'id']) ->via('orders'); } public function getOrders() { // 见上述列子 return $this->hasMany(Order::className(), ['customer_id' => 'id']); } }
Alex_J
注册时间:2018-08-02
最后登录:2024-05-23
在线时长:26小时43分
最后登录:2024-05-23
在线时长:26小时43分
- 粉丝2
- 金钱925
- 威望0
- 积分1185