2015-06-06 12:19:30 5380次浏览 2条回答 3 悬赏 0 金钱

官方文档没怎么看懂……

最佳答案

  • chocoboxxf 发布于 2015-06-07 16:41 举报

    如果你在class Order里定义了一个class Customer的关联(如order表里有一个customer_id的字段),在创建Order记录的时候,可能会有类似这样的执行:

    $order = new Order();
    $order->customer_id = $customer->id;
    $order->save();
    

    如果在Order类里定义过外键关联(如下),那就可以通过link方法用面向对象的方式来给customer_id赋值:

    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
    

    之前创建Order对象的语句就变成:

    $order = new Order();
    $order->link('customer', $customer); // $order和$customer不能都是新创建的对象
    

    这里link的作用只是将外键的值填到对应字段,但如果外键关联是通过中间表来实现的,那link会自动创建中间表记录。比如
    有order表,item表,order_item表来存储order和item的关联。参考Relations via a Junction Table

    如果在Order类里定义过外键关联如下:

    public function getItems()
    {
        return $this->hasMany(Item::className(), ['id' => 'item_id'])
            ->viaTable('order_item', ['order_id' => 'id']);
    }
    

    那就可以通过link方法来关联Item对象:

    $order = new Order();
    $order->link('items', $item);
    

    order_item表中会自动创建一条order_id为$order->id, item_id为$item->id的记录

    1 条回复
    回复于 2015-06-09 20:47 回复

    感谢,还得再深入研究下。

您需要登录后才可以回答。登录 | 立即注册
webees
见习主管

webees 成都

注册时间:2015-06-06
最后登录:2020-01-14
在线时长:10小时52分
  • 粉丝5
  • 金钱180
  • 威望10
  • 积分380

热门问题