2018-09-03 17:37:57 1637次浏览 2条回答 1 悬赏 50 金钱

现有三个表,a表连接b表,b表连接c表。
现在在a模块里面怎么写c表的连接?添加hasOne?

最佳答案

  • 花椒 发布于 2018-09-03 17:45 举报

    我也做一回搬运工吧~
    中间关联表(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']);
        }
    }
    
  • 回答于 2018-09-03 17:43 举报

    yii2里有一个via或viaTable是专门做这个工作的哦~b就是中间表~

您需要登录后才可以回答。登录 | 立即注册
Alex_J
经理

Alex_J

注册时间:2018-08-02
最后登录:2022-08-15
在线时长:26小时42分
  • 粉丝2
  • 金钱925
  • 威望0
  • 积分1185

热门问题